需求
目前公司框架封装了异常处理,但是在使用@Validated注解去判断字段的时候,返回的异常是一堆异常栈,所以要重新针对@Validated抛出的异常去自定义一下,遇到这个异常MethodArgumentNotValidException就拦截,处理在抛出去。
实现
自定义异常拦截
ApiResult 是公司框架自己封装的,所以要整合成一样的。
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;
/**
* @author cf
* @date 2023/4/12上午 11:31
*/
@Order(999999)
@RestControllerAdvice
public class ConfigExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult<?> handlerException(MethodArgumentNotValidException e) {
MethodArgumentNotValidExceptionAction methodArgumentNotValidExceptionAction = new MethodArgumentNotValidExceptionAction(e.getParameter(),e.getBindingResult());
return ApiResult.error(methodArgumentNotValidExceptionAction.getMessage());
}
}
重写MethodArgumentNotValidExceptionAction
import org.springframework.core.MethodParameter;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import java.util.Iterator;
/**
* @author cf
* @description: 针对Validated 异常抛出处理
* @date 2023/4/12下午 2:05
*/
public class MethodArgumentNotValidExceptionAction extends Exception {
private final MethodParameter parameter;
private final BindingResult bindingResult;
public MethodArgumentNotValidExceptionAction(MethodParameter parameter, BindingResult bindingResult) {
this.parameter = parameter;
this.bindingResult = bindingResult;
}
public MethodParameter getParameter() {
return this.parameter;
}
public BindingResult getBindingResult() {
return this.bindingResult;
}
//这里对异常进行了封装
public String getMessage() {
Iterator var2 = this.bindingResult.getAllErrors().iterator();
StringBuilder sb = new StringBuilder();
while (var2.hasNext()) {
ObjectError error = (ObjectError) var2.next();
sb.append("[").append(error.getDefaultMessage()).append("] ");
}
return sb.toString();
}
}
注意点
最好在扫描的时候加上此目录的扫描。@ComponentScan里面