He escrito clase del manejador de excepción personalizada para uno de mis controladores de primavera para validar si el atributo de correo de solicitud de parámetro está en el formato adecuado. Así creado una nueva clase que se extiende ResponseEntityExceptionHandler
clase y escribió con un método @ExceptionHandler
.
Pero durante el inicio de la aplicación de inicio de primavera, me estoy haciendo a continuación excepción que está deteniendo el funcionamiento de mi proyecto. Podría alguien ayudarme a resolver esto?
Excepción durante el inicio del servidor:
org.springframework.beans.factory.BeanCreationException: Error al crear el frijol con el nombre 'handlerExceptionResolver' se define en la ruta de clase de recursos [org / Spring Framework / boot / AUTOCONFIGURE / web / servlet / WebMvcAutoConfiguration $ EnableWebMvcConfiguration.class]: Haba de instancias a través de método de fábrica fallado;
excepción anidada es org.springframework.beans.BeanInstantiationException: No se pudo instanciar [org.springframework.web.servlet.HandlerExceptionResolver]: Fábrica método 'handlerExceptionResolver' produjo excepción;
excepción anidada es java.lang.IllegalStateException: método @ExceptionHandler Ambiguous mapeado para [org.springframework.web.bind.MethodArgumentNotValidException clase]: {public com.TestVO com.handler.exception.TestExceptionHandler.methodArgumentNotValidException (org.springframework.web.bind .MethodArgumentNotValidException), pública final org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException (java.lang.Exception, org.springframework.web.context.request.WebRequest) lanza java.lang.Exception}
Clase personalizada para controlar MethodArgumentNotValidException
:
@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorVO processValidationError(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
List<FieldError> fieldErrors = result.getFieldErrors();
FieldError fieldError = fieldErrors.get(0);
ErrorVO dto = new ErrorVO(fieldError.getDefaultMessage());
return dto;
}
}
La ambigüedad es porque tiene el mismo método - @ExceptionHandler tanto en las clases - ResponseEntityExceptionHandler, MethodArgumentNotValidException. Usted tiene que escribir el método reemplazado de la siguiente manera de solucionar este problema -
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
String errorMessage = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage();
List<String> validationList = ex.getBindingResult().getFieldErrors().stream().map(fieldError->fieldError.getDefaultMessage()).collect(Collectors.toList());
LOGGER.info("Validation error list : "+validationList);
ApiErrorVO apiErrorVO = new ApiErrorVO(errorMessage);
apiErrorVO.setErrorList(validationList);
return new ResponseEntity<>(apiErrorVO, status);
}