springboot 统一返回数据格式和异常处理

2020-10-11  本文已影响0人  冰花水焰

背景:为了减少在控制层重复代码的编写,如异常处理的代码块和返回数据的格式(成功返回什么数据和失败该返回什么数据)

出现异常返回的数据

image

正常返回的数据

image

统一返回数据格式

/**
 * 封装服务端响应到客户端的数据
 */
public class JsonResult {
    /**
     * 响应状态码
     */
    private Integer state=1;
    /**
     * 状态码对应的信息
     */
    private String message;
    /**
     * 响应的数据
     * 这里也可以使用泛型 private T data 在类上也加上
     */
    private Object data;

    public void setState(Integer state) {
        this.state = state;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setData(Object data) {
        this.data = data;
    }
      public JsonResult() {

    }
//要么用set方法来封装数据要么用构造方法
    public JsonResult(String message) {
        this.message=message;
    }

    public JsonResult(Object data) {
        this.data = data;
    }

    public JsonResult(Throwable e) {
        this.state=0;
        this.message=e.getMessage();
    }
}

统一的异常处理全局异常捕获

用@RestControllerAdvice加@ExceptionHandler注解来实现

@ExceptionHandler也可以直接放在某个controller里面表示处理这个controller中的这个类型的异常,如果全局和某个controller里都实现同一个异常的处理会优先使用controller里面的

创建一个统一处理异常的类

//拦截全局的异常
@RestControllerAdvice
public class GlobalExceptionHandler {
    //用来处理日志的
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    //用来处理该类型的异常
    @ExceptionHandler(ArithmeticException.class)
    public JsonResult doHandlerArithmeticException(ArithmeticException e) {
        e.printStackTrace();
        log.info("exception {}",e.getMessage());
        return new JsonResult(e);//封装异常结果
    }

}

注意:@RestControllerAdvice只能拦截controller层的异常不会拦截Interceptor的异常

优点:把异常统一处理,减少代码的重复编写,提高了可维护性

缺点:只能处理controller层的异常,对于Interceptor层的异常,spring内部的异常无能为力

使用:

@RestController
public class ArithmeticController {
    @RequestMapping("do/{n}/{n1}")
    public JsonResult handle01(@PathVariable Integer n, @PathVariable Integer n1) {
        Integer res = n/n1;
        JsonResult jsonResult = new JsonResult(res);
        jsonResult.setMessage("正确"+res);
        return jsonResult;
    }
}
上一篇下一篇

猜你喜欢

热点阅读