SpringBoot全局异常捕获
2023-12-30 05:16:22
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!