Java ResponsEentityExceptionHandler:未截获handleMethodArgumentNotValid

Java ResponsEentityExceptionHandler:未截获handleMethodArgumentNotValid,java,spring,rest,exception-handling,Java,Spring,Rest,Exception Handling,我的控制器具有以下方法: @RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public void save(@RequestBody @Valid final User resource) { createInternal(resource); } 由于资源参数之前的@Valid,当我在实体的@Column上将NULL传递到NULL=false时,我希望下面的异常处理程序会

我的控制器具有以下方法:

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void save(@RequestBody @Valid final User resource) {
    createInternal(resource);
}
由于资源参数之前的@Valid,当我在实体的@Column上将
NULL
传递到
NULL=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);
}
@覆盖
受保护的最终响应处理方法无效(最终方法参数无效),
最终HttpHeaders,
最终HttpStatus状态,
最终WebRequest(请求){
info(“错误的请求:{}”,例如getMessage());
log.debug(“错误请求:”,ex);
...
返回handleExceptionInternal(e、dto、标头、HttpStatus.BAD_请求、请求);
}
但我似乎只能这样处理:

@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);
}
@ExceptionHandler(值={ConstraintViolationException.class,
DataIntegrityViolationException.class})
公共最终响应句柄请求(最终运行时异常e,
最终WebRequest(请求){
...
返回handleExceptionInternal(例如,APIRERROR,new HttpHeaders(),HttpStatus.BAD_请求,请求);
}
为什么
handleMethodArgumentNotValid
异常处理程序没有像应该的那样拾取它

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

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

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


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

在您的“handleMethodArgumentNotValid”有机会触发之前,DefaultHandlerExceptionResolver会处理此问题

或者,如果要处理declare,
@ExceptionHandler(MethodArgumentNotValidException.class)

@RequestBody方法参数可以在 在哪种情况下,将使用配置的验证器对其进行验证 例如。使用MVC命名空间或MVC Java配置时 JSR-303验证器自动配置为假定JSR-303 实现在类路径上可用

与@modeldattribute参数一样,可以使用Errors参数 用于检查错误。如果未声明此类参数,则 将引发MethodArgumentNotValidException。例外是 在DefaultHandlerExceptionResolver中处理,它发送400 错误返回到客户端。在“handleMethodArgumentNotValid”之前 有机会开火,我是汉德夫

@ExceptionHandler({ConstraintViolationException.class})
公共责任处理约束约束约束例外,
WebRequest(请求){
//错误处理
返回新的响应属性(例如getMessage(),HttpStatus.BAD_请求);
}

更多详情参见

我没有在我的实体上用“@NotNull”注释我的列,因此“@Valid”不起作用。我有一个“@Column(nullable=false)”,但它没有抓住这个方法。这个答案完全是胡说八道。这是关于一个被重写的处理程序。在连接应用程序时,对其进行两次注释会导致错误。”不明确的异常处理程序“”。
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<> handleConstraintViolation(ConstraintViolationException ex, 
    WebRequest request) {
    // error handeling

    return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}