SpringBoot全局异常捕获

发布时间:2023年12月30日
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);
    }
    
}
文章来源:https://blog.csdn.net/qq_45110186/article/details/135294154
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。