美文网首页
springboot 统一返回数据格式和异常处理

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

作者: 冰花水焰 | 来源:发表于2020-10-11 09:12 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:springboot 统一返回数据格式和异常处理

          本文链接:https://www.haomeiwen.com/subject/vunspktx.html