Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ResponsEentityExceptionHandler:未截获handleMethodArgumentNotValid

ResponsEentityExceptionHandler:未截获handleMethodArgumentNotValid
EN

Stack Overflow用户
提问于 2016-11-18 06:12:33
回答 3查看 5.7K关注 0票数 1

我的控制器有以下方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void save(@RequestBody @Valid final User resource) {
    createInternal(resource);
}

由于资源参数前有@Valid,因此当我将NULL传入实体的@列上的nullable=false时,我希望它会被下面的异常处理程序截获。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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);
}

但看起来我只能这样处理了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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异常处理程序没有像它应该的那样处理它呢?

EN

回答 3

Stack Overflow用户

发布于 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

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestbody

票数 1
EN

Stack Overflow用户

发布于 2016-11-18 06:45:14

为什么handleMethodArgumentNotValid异常处理程序没有像它应该的那样处理它?

Spring容器(在启动期间)扫描所有用@RequestMapping@ExceptionHandler注释的控制器方法。

稍后,当请求带有url时,将使用handlermapping标识控制器方法,然后注入所有必需的依赖项(控制器方法参数),如ModelHttpRequest等。并委托调用控制器方法来服务输入请求。

由于您的handleMethodArgumentNotValid没有使用@RequestMapping@ExceptionHandler进行注释,Spring容器无法识别此方法。

票数 -1
EN

Stack Overflow用户

发布于 2019-06-26 10:43:21

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40670447

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文