Sha*_*elu 2 java spring exceptionhandler spring-boot
我已经为我的一个spring控制器编写了自定义异常处理程序类,以验证来自请求参数的email属性是否采用正确的格式。因此,创建了一个扩展ResponseEntityExceptionHandler类的新类,并使用编写了一个方法@ExceptionHandler。
但是在春季启动应用程序启动期间,我遇到了以下异常,该异常正在停止运行我的项目。有人可以帮我解决这个问题吗?
服务器启动期间发生异常:
org.springframework.beans.factory.BeanCreationException:在类路径资源[org / springframework / boot / autoconfigure / web / servlet / WebMvcAutoConfiguration $ EnableWebMvcConfiguration.class]中创建名称为'handlerExceptionResolver'的bean时出错。
嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.web.servlet.HandlerExceptionResolver]:工厂方法'handlerExceptionResolver'抛出了异常;
嵌套异常是java.lang.IllegalStateException:为[类org.springframework.web.bind.MethodArgumentNotValidException]映射的模糊@ExceptionHandler方法:{public com.TestVO com.handler.exception.TestExceptionHandler.methodArgumentNotValidException(org.springframework.web.bind .MethodArgumentNotValidException),公共最终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;
}
}
Run Code Online (Sandbox Code Playgroud)
Ari*_*tex 11
您在这里遇到的问题是意料之中的。您正在有效地扩展 Spring ResponseEntityExceptionHandler,默认情况下它已经MethodArgumentNotValidException在它自己的@ExceptionHandler注释中包含了一个声明。
您可以从类的来源轻松检查这一点:
这就是您在日志中看到此错误的原因:
java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]
Run Code Online (Sandbox Code Playgroud)
基于以上所有内容,您应该删除自己的异常处理程序方法并覆盖其中的方法。
Spring 有一个内置的ResponseEntityExceptionHandlerfor MethodArgumentNotValidException. 因此,对于同一个异常,您有两个处理程序,这是不允许的。
您可以尝试覆盖ResponseEntityExceptionHandler.handleMethodArgumentNotValid().
小智 8
歧义是因为在两个类(ResponseEntityExceptionHandler,MethodArgumentNotValidException)中都有相同的方法-@ExceptionHandler。您需要按如下所示编写重写的方法来解决此问题-
@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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3649 次 |
| 最近记录: |