necesidad
En la actualidad, el marco de trabajo de la empresa encapsula el manejo de excepciones, pero cuando se usa la anotación @Validated para evaluar los campos, la excepción devuelta es un montón de pilas de excepciones, por lo que es necesario personalizar la excepción lanzada por @Validated nuevamente. MethodArgumentNotValidException Interceptar, procesar y desechar.
lograr
La interceptación de excepciones personalizadas
ApiResult está encapsulada por el propio marco de la empresa, por lo que debe integrarse en el mismo.
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());
}
}
重写MethodArgumentNotValidExceptionAcción
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();
}
}
punto importante
Es mejor agregar el escaneo de este directorio al escanear. Dentro de @ComponentScan