在启动spring启动应用程序时,获取methodargumentnotvalidexceptionMap的不明确@exceptionhandler方法

mv1qrgav  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(463)

我已经为我的一个spring控制器编写了自定义异常处理程序类,以验证request param的email属性的格式是否正确。因此创建了一个新类 ResponseEntityExceptionHandler 类并用 @ExceptionHandler .
但在SpringBoot应用程序启动期间,我遇到了以下异常,即停止运行我的项目。有人能帮我解决这个问题吗?
服务器启动期间出现异常:
org.springframework.beans.factory.beancreationexception:创建名为“handlerexceptionresolver”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/web/servlet/webmvcautoconfiguration$enablewebmvcconfiguration.class]中定义:通过工厂方法示例化bean失败;
嵌套异常为org.springframework.beans.beaninstantiationexception:未能示例化[org.springframework.web.servlet.handlerexceptionresolver]:工厂方法“handlerexceptionresolver”引发异常;
嵌套异常为java.lang.illegalstateexception:为[class org.springframework.web.bind.methodargumentnotvalidexception]Map的不明确@exceptionhandler方法:{public com.testvo com.handler.exception.testexceptionhandler.methodargumentnotvalidexception(org.springframework.web.bind.methodargumentnotvalidexception),public final org.springframework.http.responseentity org.springframework.web.servlet.mvc.method.annotation.responseentityexceptionhandler.handleexception(java.lang.exception,org.springframework.web.context.request.webrequest)抛出java.lang.exception}
要处理的自定义类 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;
    }
}
ghhkc1vu

ghhkc1vu1#

歧义是因为两个类中都有相同的方法-@exceptionhandler-responseentityexceptionhandler,methodargumentnotvalidexception。为了解决这个问题,您需要编写如下重写方法-

@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);
   }
6ljaweal

6ljaweal2#

你在这里遇到的问题是意料之中的。你有效地延长了Spring ResponseEntityExceptionHandler 默认情况下已经包含 MethodArgumentNotValidException 在它自己的 @ExceptionHandler 注解。
您可以从类的源代码轻松地检查这一点:
https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/responseentityexceptionhandler.java
这就是为什么您会在日志中看到这一点错误:

java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]

基于以上所有内容,您应该删除自己的异常处理程序方法并重写其中的异常处理程序方法。

gpnt7bae

gpnt7bae3#

Spring有一个内置的 ResponseEntityExceptionHandler 为了 MethodArgumentNotValidException . 因此,对于同一个异常有两个处理程序,这是不允许的。
你可以尝试覆盖 ResponseEntityExceptionHandler.handleMethodArgumentNotValid() .

相关问题