SpringBoot全局异常捕获

1、全局异常处理说明

在项目中,如果没有进行全局异常捕获,项目运行时遇到问题,返回给用户的结果状态码是500,并且会直接将错误信息展示到用户面前,给用户带来不好的体验。 在SpringBoot项目中,使用以下三个注解可以实现全局异常捕获功能。

  • @RestControllerAdvice:捕获controller层抛出的异常;
  • @ExceptionHandler:指定捕获的异常类型,如果是捕获所有的异常,只需要将value指定为Exception.class;
  • @Order:指定当前异常处理类执行的优先级, 数字越大越靠后执行,执行了靠前优先级的类就不会执行靠后优先级的类。
2、全局异常处理代码
  • 代码说明

全局异常捕获涉及三部分代码,统一状态码的枚举类,统一返回结果的响应类,全局异常和具体异常捕获类。

  • 统一状态码枚举类
import lombok.Data;
import lombok.Getter;
public enum CommonStatusEnum {

    /**
     * token 错误码: 1100 - 1199
     */
    TOKEN_VALID(1100, "Token 无效"),

    /**
     * 用户错误码 1200 -1299
     */
    USER_NOT_EXISTS(1200, "当前用户不存在"),

    /**
     * 成功
     */
    SUCCESS(1, "success"),

    /**
     * 失败
     */
    FAILE(0, "统一异常:fail");

    @Getter
    private int code;
    @Getter
    private String value;

    CommonStatusEnum(int code, String value){
        this.code = code;
        this.value = value;
    }
    
}
  • 统一结果返回类
import lombok.ConfigurationKeys;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true) // 支持链式编程
public class ResponseResult<T> {
    private int code;
    private String message;
    private T data;

    /**
     * 成功响应有数据的方法
     * @param data
     * @return
     * @param <T>
     */
    public static <T> ResponseResult success(T data){
        // 链式编程
        return new ResponseResult().setCode(CommonStatusEnum.SUCCESS.getCode()).setMessage(CommonStatusEnum.SUCCESS.getValue()).setData(data);
    }

    /**
     * 成功响应默认没有数据的方法
     * @return
     * @param <T>
     */
    public static <T> ResponseResult success(){
        return new ResponseResult().setCode(CommonStatusEnum.SUCCESS.getCode()).setMessage(CommonStatusEnum.SUCCESS.getValue());
    }

    /**
     *
     * @param data
     * @return
     * @param <T>
     */
    public static <T> ResponseResult fail(T data){
        return new ResponseResult().setData(data);
    }

    /**
     * 自定义失败 错误码 和 提升信息
     * @param code
     * @param message
     * @return
     */
    public static ResponseResult fail(int code, String message){
        return new ResponseResult().setCode(code).setMessage(message);
    }

    /**
     * 自定义失败 错误码 和 提示信息 和 数据
     * @param code
     * @param message
     * @param data
     * @return
     */
    public static ResponseResult fail(int code , String message, String data){
        return new ResponseResult().setCode(code).setMessage(message).setData(data);
    }

}
  • 全局统一异常处理类
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 统一异常处理类
 */
@RestControllerAdvice
@Order(99)
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseResult exceptionHandler(Exception e) {
        e.printStackTrace();
        return ResponseResult.fail(CommonStatusEnum.FAILE.getCode(), CommonStatusEnum.FAILE.getValue());
    }
    
}
  • 参数校验失败处理类
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;

/**
*参数校验异常处理类
*/
@RestControllerAdvice
@Order(1)
public class GlobalValidationExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseResult validationExceptionHandler(MethodArgumentNotValidException e){
        return ResponseResult.fail(CommonStatusEnum.VALIDATION_EXCEPTION.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseResult validationExceptionHandler(ConstraintViolationException e){
        System.out.println(e);
        String message = "";
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        for (ConstraintViolation<?> c : constraintViolations) {
            message = c.getMessageTemplate();
        }
        return ResponseResult.fail(CommonStatusEnum.VALIDATION_EXCEPTION.getCode(), message);
    }
    
}

相关推荐

  1. SpringBoot全局异常捕获

    2023-12-31 00:16:04       35 阅读
  2. SpringBoot全局异常处理

    2023-12-31 00:16:04       28 阅读
  3. Springboot全局异常处理

    2023-12-31 00:16:04       31 阅读
  4. SpringBoot全局异常处理方法

    2023-12-31 00:16:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-31 00:16:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-31 00:16:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-31 00:16:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-31 00:16:04       20 阅读

热门阅读

  1. 数据被锁?被.mkp 勒索病毒攻击后的拯救行动

    2023-12-31 00:16:04       32 阅读
  2. php5.6安装openssl扩展

    2023-12-31 00:16:04       42 阅读
  3. SSRF靶场安装测试记录

    2023-12-31 00:16:04       34 阅读
  4. 结构体\判断日期是否合法(代码分步解析)

    2023-12-31 00:16:04       37 阅读
  5. centos7.9安装图形远程控制桌面工具rdesktop

    2023-12-31 00:16:04       40 阅读
  6. 2. 云原生实战之kubesphere搭建

    2023-12-31 00:16:04       33 阅读
  7. 力扣133. 克隆图

    2023-12-31 00:16:04       32 阅读
  8. C语言中的标准IO

    2023-12-31 00:16:04       32 阅读
  9. Android 循环滚动的列表-类似弹幕效果

    2023-12-31 00:16:04       39 阅读
  10. pycharm 运行setup.py

    2023-12-31 00:16:04       38 阅读
  11. .Net Core 防御XXS攻击

    2023-12-31 00:16:04       43 阅读
  12. Fastboot指令大全

    2023-12-31 00:16:04       40 阅读
  13. 学习记录.spring中的单例bean是线程安全的吗?

    2023-12-31 00:16:04       41 阅读