java - 在启动 Spring Boot 应用程序时获取为 MethodArgumentNotValidException 映射的不明确的 @ExceptionHandler 方法
问题描述
我已经为我的一个 spring 控制器编写了自定义异常处理程序类,以验证来自请求参数的电子邮件属性是否格式正确。所以创建了一个扩展ResponseEntityExceptionHandler
类的新类并用@ExceptionHandler
.
但是在春季启动应用程序启动期间,我遇到了停止运行我的项目的异常。有人可以帮我解决这个问题吗?
服务器启动期间的异常:
org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]中定义的名称为“handlerExceptionResolver”的bean创建错误:通过工厂方法进行的bean实例化失败;
嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.web.servlet.HandlerExceptionResolver]:工厂方法“handlerExceptionResolver”抛出异常;
嵌套异常是 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) 抛出java.lang.异常}
要处理的自定义类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;
}
}
解决方案
歧义是因为您在两个类中都有相同的方法 - @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);
}
推荐阅读
- c++ - 使用 glvertex4i 传递网格面索引时出现顶点着色器错误
- python - 用于 python 输出数据文件的 GCP 云函数
- android - 检查 SkuDetails 订阅计费频率
- python - 如何用for循环和def函数替换列值?
- c# - 具有表中多个字段键的实体框架脚手架
- batch-file - 批处理脚本 - &符号和空格
- scala - stackoverflow 中提供的两个代码总和解决方案即使在 IntelliJ 上也不起作用
- laravel-5 - 如何在 laravel 中使用用户页面的资源选项?
- jquery - addClass 不会将类添加到元素
- python - 为什么它不适用于 Python 和 discord.py