目录
1. 统一返回数据格式
目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。
1.1 统一结果的一般形式
- 是否响应成功
- 响应状态码
- 状态码描述
- 响应数据
1.2 创建状态码接口类
package com.miaxis.utils;
public interface ResultCode {
/*成功状态码*/
Integer SUCCESS = 20000;
/*失败的状态码*/
Integer ERROR = 20001;
}
1.3 创建统一结果类
- 只可以调用统一结果类的方法,不可以直接创建;
- 内置静态方法,返回对象;
- 为便于自定义统一结果的信息,建议使用链式编程,将返回对象设类本身,即return this;
- 响应数据由于为json格式,可定义为JsonObject或Map形式;
package com.miaxis.utils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class ResponseResult{
private ResponseResult(){}
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "状态码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回的数据")
private Map<String,Object> data = new HashMap<>();
/*提供工具方法*/
public static ResponseResult ok(){
ResponseResult responseResult = new ResponseResult();
responseResult.setSuccess(true);
responseResult.setCode(ResultCode.SUCCESS);
responseResult.setMessage("成功");
return responseResult;
}
public static ResponseResult error(){
ResponseResult responseResult = new ResponseResult();
responseResult.setSuccess(false);
responseResult.setCode(ResultCode.ERROR);
responseResult.setMessage("失败");
return responseResult;
}
public ResponseResult success(Boolean success){
this.setSuccess(success);
return this;
}
public ResponseResult message(String message){
this.setMessage(message);
return this;
}
public ResponseResult code(Integer code){
this.setCode(code);
return this;
}
public ResponseResult data(String key,Object value){
this.data.put(key,value);
return this;
}
public ResponseResult data(Map<String,Object> map){
this.setData(map);
return this;
}
}
1.4 控制层使用统一结果示例
@RestController
@RequestMapping("/mybatis/user")
public class UserController {
/*使用代码生成器生成的service当中已经有很多的基础服务 ,直接调用即可*/
@Autowired
private UserService userService;
@GetMapping("/getUserList")
public ResponseResult getUserList(){
List<User> list = userService.list(null);
return ResponseResult.ok().data("list",list);
}
}
json结果
2. 统一异常处理
使用统一返回结果时,还有一种情况,就是程序的保存是由于运行时异常导致的结果,有些异常我们无法提前预知,不能正常走到我们return的ResponseResult对象返回。
因此,需要定义一个统一的全局异常来捕获这些信息,并作为一种结果返回控制层。
@ControllerAdvice
该注解为统一异常处理的核心,是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上。
该类中的设计思路
- 使用@ExceptionHandler注解捕获指定或自定义的异常;
- 使用@ControllerAdvice集成@ExceptionHandler的方法到一个类中;
- 必须定义一个通用的异常捕获方法,便于捕获未定义的异常信息;
- 自定一个异常类,捕获针对项目或业务的异常;
- 异常的对象信息补充到统一结果枚举中;
2.1 自定义异常处理类
package com.miaxis.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor //生成带参数的构造器
public class CustomException extends RuntimeException{
private Integer code;
private String msg;
}
2.2 全局异常处理类
package com.miaxis.exception;
import com.miaxis.utils.ResponseResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/*全局异常处理器, 只要发生了异常,如果在自己控制当中 没有去捕获 , 就会到此控制器*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult error(Exception e){
e.printStackTrace();
return ResponseResult.error().message(e.getMessage());
}
//自定义异常
@ExceptionHandler(CustomException.class)
@ResponseBody //返回json数据
public ResponseResult error(CustomException e){
e.printStackTrace();
return ResponseResult.error().code(e.getCode()).message(e.getMsg());
}
}
2.3 控制层使用统一异常处理示例
@RestController
@RequestMapping("/mybatis/user")
public class UserController {
/*使用代码生成器生成的service当中已经有很多的基础服务 ,直接调用即可*/
@Autowired
private UserService userService;
@GetMapping("/getUserList")
public ResponseResult getUserList(){
float t = 1/0; //测试异常情况
List<User> list = userService.list(null);
return ResponseResult.ok().data("list",list);
}
}
json结果