SpringBoot使用validation验证接口数据时 返回的信息不好阅读 所以使用@RestControllerAdice来捕捉异常并处理返回
上代码:
/**
* @Author: yipeng.liu
* @Date: 2021/11/3 18:05
* @Description: adviceException 捕捉异常 接口返回
*/
@Log4j2
@RestControllerAdvice
public class adviceException {
@ExceptionHandler({
BindException.class, // 绑定异常
MethodArgumentNotValidException.class, // 参数无效异常
ConstraintViolationException.class // 违反约束异常
})
public WebResp<String> handleAdviceException(Exception e) {
String errorMsg = "参数验证错误";
BindingResult bindingResult = null;
// instanceof 检查一个对象是否为一个类的实例
if (e instanceof BindException) {
BindException bindException = (BindException) e;
bindingResult = bindException.getBindingResult();
}
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException methodArgumentNotValidException =
(MethodArgumentNotValidException) e;
bindingResult = methodArgumentNotValidException.getBindingResult();
}
if (e instanceof ConstraintViolationException) {
ConstraintViolationException constraintViolationException = (ConstraintViolationException) e;
errorMsg = constraintViolationException.getMessage();
}
if (bindingResult != null) {
for (FieldError filedError : bindingResult.getFieldErrors()) {
errorMsg = filedError.getDefaultMessage();
}
}
return WebResp.error(500, errorMsg);
}
}
注解解释:
- 主要就是用 @RestControllerAdvice + @ExceptionHandler来捕获处理异常信息 理解:@RestControllerAdvice 是对Controller进行增强的,可以全局捕获spring mvc抛的异常 @RestControllerAdvice 与 @ControllerAdvice 区别就是 RestControllerAdvice 会将方法返回的信息序列化 返回,不会调用视图解析跳转页面,ControllerAdvice反之
- 重点使用以下异常类 都是 validation 包里的 BindException.class, //绑定异常 MethodArgumentNotValidException.class, // 参数无效异常 ConstraintViolationException.class // 违反约束异常
- 返回的 WebResp是我自定义的 返回类 WebResp.class:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WebResp<T> {
private Object code;
private String message;
private T data;
public static <T> WebResp<T> success(T data) {
return new WebResp<>(0, "success", data);
}
public static <T> WebResp<T> error(Object code, String message) {
return new WebResp<>(code, message, null);
}
}