springboot返回统一接口与统一异常处理

编写人员:yls

编写时间:2019-9-19

  1. 0001-springboot返回统一接口与统一异常处理

    1. 简介

    1. [创建统一的返回格式 Result](#创建统一的返回格式 Result "创建统一的返回格式 Result")

    1. 封装统一返回格式工具类ResultUtil

    1. 测试用的实体类User

    1. 使用枚举统一管理返回码和返回信息

    1. 自定义异常类

    1. 统一异常处理

    1. 创建UserController

    1. 测试结果

简介

在做后端服务开发时,想要每次获取的数据和抛出的异常保持统一的返回结果,结构清晰,方便管理

创建统一的返回格式 Result

package com.example.itokenserviceadmin.config.baseResult;

import lombok.Data;

/**
* http请求最外层对象,统一返回接口
* @param <T>
*/ @Data
public class Result<T> {
//返回码
private Integer code;
//提示信息
private String msg;
//返回具体内容
private T data; }

封装统一返回格式工具类ResultUtil

package com.example.itokenserviceadmin.utils;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException; /**
* 统一返回接口的工具类
*/
public class ResultUtil {
public static Result success(Object object) {
Result result = new Result();
result.setCode(ResultEnum.SUCCESS.getCode());
result.setMsg(ResultEnum.SUCCESS.getMsg());
result.setData(object);
return result;
} public static Result success() {
return success(null);
} public static Result error(Integer code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
public static Result error(ResultEnum resultEnum) {
return error(resultEnum.getCode(),resultEnum.getMsg());
}
public static Result error(UserException userException) {
return error(userException.getCode(),userException.getMessage());
}
}

测试用的实体类User

package com.example.itokenwebadmin.entity;

import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {
private String id;
private String name;
private String password;
}

使用枚举统一管理返回码和返回信息

package com.example.itokenserviceadmin.config.exceptionHandle;

import lombok.AllArgsConstructor;
import lombok.Getter; /**
* 在自定义异常的错误码和信息时,如果过多,没有统一管理,则会出现重复。
* 使用枚举统一管理code和message:
*/
@Getter
@AllArgsConstructor
public enum ResultEnum {
UNKNOW_ERROR(-1, "未知错误"),
SUCCESS(0, "成功");
private Integer code;
private String msg;
}

自定义异常类

package com.example.itokenserviceadmin.config.exceptionHandle;

import lombok.Data;

@Data
public class UserException extends RuntimeException { /**
* 我们希望定位的错误更准确,
* 希望不同的错误可以返回不同的错误码,所以可以自定义一个Exception
*
*
* 注意要继承自RuntimeException,底层RuntimeException继承了Exception,
* spring框架只对抛出的异常是RuntimeException才会进行事务回滚,
* 如果是抛出的是Exception,是不会进行事物回滚的
*/
public UserException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
} private Integer code; }

统一异常处理

package com.example.itokenserviceadmin.config.exceptionHandle;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /**
* 统一异常处理
*/
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {
if (e instanceof UserException) {
UserException userException = (UserException) e;
return ResultUtil.error(userException);
} else {
return ResultUtil.error(-1, e.getMessage());
}
}
}

创建UserController

package com.example.itokenserviceadmin.controller;

import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException;
import com.example.itokenserviceadmin.entity.User;
import com.example.itokenserviceadmin.service.UserService;
import com.example.itokenserviceadmin.serviceImpl.UserImpl;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import java.util.HashMap;
import java.util.Map; @RestController
public class UserController { @Autowired
private UserService userService; @RequestMapping("/success")
public Result<User> success(User user){
user.setId("3");
return ResultUtil.success(user);
} @RequestMapping("/err")
public Result err(){
return ResultUtil.error(ResultEnum.UNKNOW_ERROR);
} @RequestMapping("/exception")
public void exception() throws Exception {
throw new UserException(ResultEnum.UNKNOW_ERROR);
}
}

运行测试结果

springboot返回统一接口与统一异常处理的更多相关文章

  1. WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证

    为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...

  2. 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

    ## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...

  3. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  4. 《RESTful Web Services》第一章 使用统一接口

    序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性     可见性是HTTP的一个核 ...

  5. axios统一接口管理及优化

    之前我写了一篇文章,分享了自己的项目中对于接口管理的方法.总结下来就是:定义接口文件--withAxios导出--调用接口方法.这样实现了接口的统一管理和调用接口的语义化与简单化. 根据在项目的使用, ...

  6. Python-通过实例方法调用-统一接口的实现-getter methodcaller

    某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...

  7. contentprovider提供程序间共享数据的统一接口

    contentprovider提供程序间共享数据的统一接口

  8. 在nginx中使用lua直接訪问mysql和memcaced达到数据接口的统一

    安装nginx參见<nginx+lua+redis构建高并发应用> 让nginx 中的nginx_lua_module支持mysql 和memcache 下载 https://github ...

  9. SpringBoot写后端接口,看这一篇就够了!

    摘要:本文演示如何构建起一个优秀的后端接口体系,体系构建好了自然就有了规范,同时再构建新的后端接口也会十分轻松. 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等 ...

随机推荐

  1. Python的字符串编码

    本文用实验详细地演示了Python2和Python3在字符串编码上的区别. 在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量.这些字符串的一个重要限制是它们无法完全地支持国际 ...

  2. 设置Linux支持中文

    1.首先在command输入locale,可以看到Linux下默认的系统语言的是英文 2.vim ~/.bashrc打开这个文件,该文件夹相当于系统配置文件 3.打开后,将后三行命令输入到文档中,最后 ...

  3. Ubuntu安装NASM和简单的使用教程

    1. 安装 sudo apt-get install nasm 这样nasm就安装好了,终端输入命令: nasm -version 输出版本信息就说明安装成功 2. 使用 创建"hello. ...

  4. 聊聊面试-int和Integer的区别

    最近面试了很多候选人,发现很多人都不太重视基础,甚至连工作十几年,项目经验十几页的老程序员,框架学了一大堆,但是很多 Java 相关的基础知识却很多都答不上来.还有很多人会回答,只知道要用,但是从来不 ...

  5. gedit 外部工具——快捷运行

    可快捷编译运行一些代码,适合新手使用. 配置如下. 快捷键:F5 保存:当前文档 输入:无 输出:无 使用范围:所有文档,所有语言 脚本如下. #!/bin/sh #author: srczhang# ...

  6. Twitter-Snowflake:自增ID算法

    简介 Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,后来团队就研究如何产生完美的自增ID,以满足两个基本的要求: 每秒能生成几十万条 ID ...

  7. 【python数据分析实战】电影票房数据分析(二)数据可视化

    目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...

  8. F#周报2019年第43期

    新闻 F# eXchange 2020--征文通知 FSSF在忙什么?2019年第三季度版本 Miguel强烈推荐使用TensorFlow.NET 运行在ASP.NET Core 3上的SAFE-Bo ...

  9. 达孚电子(NDF)参加2019年印度电子元器件展圆满成功

    2019年9月27日-29日,达孚电子(NDF)参加2019年印度国际电子元器件及生产设备展览会在印度国际展览中心举得圆满成功,为期三天的展会中,打造了一场电子元器件行业交流的饕餮盛宴. 本次展会取得 ...

  10. gulp 自动化管理工具实现全过程

    1.全局安装gulp npm install gulp -g 2.项目内安装gulp npm install gulp -s 3.项目根目录新建gulpfile.js js内代码: //载入gulp核 ...