获取不明确的@ExceptionHandler方法映射为方法参数NotValidException在启动弹簧引导应用程序时

2022-09-01 11:18:39

我已经为我的一个弹簧控制器编写了自定义异常处理程序类,以验证来自请求参数的电子邮件属性是否采用正确的格式。因此创建了一个扩展类的新类,并使用 编写了一个方法。ResponseEntityExceptionHandler@ExceptionHandler

但是在春季启动应用程序启动期间,我遇到了以下异常,即停止运行我的项目。有人可以帮我解决这个问题吗?

服务器启动期间的异常:

org.springframework.beans.factory.BeanCreationException: 在类路径资源 [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class] 中创建名为'handlerExceptionResolver' 的 bean 时出错: 通过工厂方法实例化失败;
嵌套异常是 org.springframework.beans.BeanInstantiationException: Failed to instanceiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception;
nested exception is java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]: {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) throws 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;
    }
}

答案 1

多义性是因为您在两个类中都有相同的方法 - @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);
   }

答案 2

您在这里遇到的问题是可以预料的。您正在有效地扩展Spring,默认情况下,它已在其自己的注释中包含了一个声明。ResponseEntityExceptionHandlerMethodArgumentNotValidException@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]

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


推荐