我的控制器有以下方法:
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void save(@RequestBody @Valid final User resource) {
createInternal(resource);
}
由于资源参数前有@Valid,因此当我将NULL
传入实体的@列上的nullable=false
时,我希望它会被下面的异常处理程序截获。
@Override
protected final ResponseEntity<Object> handleMethodArgumentNotValid(final MethodArgumentNotValidException e,
final HttpHeaders headers,
final HttpStatus status,
final WebRequest request) {
log.info("Bad Request: {}", ex.getMessage());
log.debug("Bad Request: ", ex);
...
return handleExceptionInternal(e, dto, headers, HttpStatus.BAD_REQUEST, request);
}
但看起来我只能这样处理了:
@ExceptionHandler(value = { ConstraintViolationException.class,
DataIntegrityViolationException.class })
public final ResponseEntity<Object> handleBadRequest(final RuntimeException e,
final WebRequest request) {
...
return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
为什么handleMethodArgumentNotValid
异常处理程序没有像它应该的那样处理它呢?
发布于 2016-11-18 06:47:02
在您的“handleMethodArgumentNotValid”有机会触发之前,DefaultHandlerExceptionResolver会处理此事件
或者,如果要处理声明,则使用@ExceptionHandler(MethodArgumentNotValidException.class)
@RequestBody方法参数可以用@Valid注解,在这种情况下,它将使用配置的Validator实例进行验证。在使用MVC名称空间或MVC Java配置时,假设类路径上有JSR-303实现,则会自动配置JSR-303验证器。
就像@ModelAttribute参数一样,可以使用错误参数来检查错误。如果未声明这样的参数,则将引发MethodArgumentNotValidException。异常在DefaultHandlerExceptionResolver中处理,它将一个400错误发送回客户端。在你的“handleMethodArgumentNotValid”有机会触发之前,这是handndf
发布于 2016-11-18 06:45:14
为什么handleMethodArgumentNotValid异常处理程序没有像它应该的那样处理它?
Spring容器(在启动期间)扫描所有用@RequestMapping
和@ExceptionHandler
注释的控制器方法。
稍后,当请求带有url
时,将使用handlermapping
标识控制器方法,然后注入所有必需的依赖项(控制器方法参数),如Model
、HttpRequest
等。并委托调用控制器方法来服务输入请求。
由于您的handleMethodArgumentNotValid
没有使用@RequestMapping
或@ExceptionHandler
进行注释,Spring容器无法识别此方法。
发布于 2019-06-26 10:43:21
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<> handleConstraintViolation(ConstraintViolationException ex,
WebRequest request) {
// error handeling
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
有关更多细节,请访问https://www.baeldung.com/global-error-handler-in-a-spring-rest-api
https://stackoverflow.com/questions/40670447
复制