zoukankan      html  css  js  c++  java
  • SpringBoot 全局异常配置

    在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示。

    一、默认异常机制

    默认异常处理(SpringBoot 默认提供了两种机制,一种是针对于web浏览器访问的错误页面响应,另一种则是针对于 接口测试工具等 的参数响应处理):

    原理:SpringBoot默认提供了程序出错的结果映射路径/error。这个/error请求会在BasicErrorController中处理,其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自客户端浏览器(浏览器通常默认自动发送请求头内容Accept:text/html)还是客户端接口的调用,以此来决定返回页面视图还是 JSON 消息内容。

    二、自定义json格式异常响应

    通过 @ControllerAdvice/@RestControllerAdvice@ExceptionHandler 注解全局异常自定义响应类

    1. 首先定义响应状态码枚举类
    public enum ResultCode {
        SUCCESS(200),//成功
        FAIL(400),//失败
        UNAUTHORIZED(401),//未认证(签名错误)
        NOT_FOUND(404),//接口不存在
        INTERNAL_SERVER_ERROR(500);//服务器内部错误
        
        private final int code;
        
        ResultCode(int code) {
            this.code = code;
        }
    
        public int code() {
            return code;
        }
    }
    
    1. 定义 响应类
    public class Result {
    
        /**
         * 状态响应码
         */
        private int code;
    
        /**
         * 响应结果 成功/失败
         */
        private boolean success;
    
        /**
         * 响应信息
         */
        private String message;
    
        /**
         * 响应数据
         */
        @JsonInclude(JsonInclude.Include.NON_NULL)
        private Object data;
    
        public Result setCode(ResultCode resultCode) {
            this.code = resultCode.code();
            return this;
        }
    
        public int getCode() {
            return code;
        }
    
        public boolean isSuccess() {
            return success;
        }
    
        public Result setSuccess(boolean success) {
            this.success = success;
            return this;
        }
    
        public String getMessage() {
            return message;
        }
    
        public Result setMessage(String message) {
            this.message = message;
            return this;
        }
    
        public Object getData() {
            return data;
        }
    
        public Result setData(Object data) {
            this.data = data;
            return this;
        }
    }
    
    1. 对响应结果封装,做预处理
    public class ResultGenerator {
    
        private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
    
        public static Result genSuccessResult() {
            return new Result()
                    .setCode(ResultCode.SUCCESS)
                    .setSuccess(true)
                    .setMessage(DEFAULT_SUCCESS_MESSAGE);
        }
    
        public static Result genSuccessResult(Object data) {
            return new Result()
                    .setCode(ResultCode.SUCCESS)
                    .setSuccess(true)
                    .setMessage(DEFAULT_SUCCESS_MESSAGE)
                    .setData(data);
        }
    
        public static Result genFailResult(String message) {
            return new Result()
                    .setCode(ResultCode.FAIL)
                    .setSuccess(false)
                    .setMessage(message);
        }
    }
    
    1. 异常处理类
    @RestControllerAdvice
    public class ExceptionControllerAdvice {
    
        @ExceptionHandler(Exception.class)
        public Result jsonErrorHandler(HttpServletRequest req, Exception e){
            return ResultGenerator.genFailResult(e.getMessage());
        }
    }
    

    三、自定义异常处理页面

    1. 在templates下新建error.html页面

    2. 做错误页面异常处理 返回 ModelAndView

        @ExceptionHandler(Exception.class)
        public Object handleException(Exception e){
                ModelAndView modelAndView = new ModelAndView();
                modelAndView.addObject("msg", e.getMessage());
                modelAndView.addObject("url", req.getRequestURL());
                modelAndView.addObject("stackTrace", e.getStackTrace());
                modelAndView.setViewName("error");
                return modelAndView;
        }
    


    作者:关小涛
    学习和分享是博客最大的乐趣,欢迎大家取之所需。
    努力是自己努力的原因,每周天写博客总结工作中的新技能和出现的问题
  • 相关阅读:
    Collection(集合)知识点总结
    【Mysql 学习】mysql 的使用复习
    解决Address localhost:1099 is already in use
    mysql8.0中dcl语句修改密码的语法
    mysql+sqlyog 多表查询练习
    MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    JDBC连接Mysql 8.0.12版本的几个注意事项
    JSTL学习
    64-多个参数个数
    63-参数的使用
  • 原文地址:https://www.cnblogs.com/XtsLife/p/11383594.html
Copyright © 2011-2022 走看看