ResponsEentityExceptionHandler:handleMethodArgumentNotValid未截获

时间:2016-11-18 06:12:33

标签: java spring rest exception-handling

我的控制器有以下方法:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "suppressImplicitAnyIndexErrors": true,
    "baseUrl": "./app",
    "outDir": "./dist"
  }
}

由于资源参数之前的@Valid,我希望当我将@RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public void save(@RequestBody @Valid final User resource) { createInternal(resource); } 传递到我的实体的@Column上的NULL时,它会被以下异常处理程序拦截,< / p>

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); } 异常处理程序不应该像它应该那样选择它?

3 个答案:

答案 0 :(得分:1)

在你的&#39; handleMethodArgumentNotValid&#39;之前有机会触发,DefaultHandlerExceptionResolver处理这个

或者如果你想处理声明,@ExceptionHandler(MethodArgumentNotValidException.class)

  

@RequestBody方法参数可以使用@Valid,in进行注释   在哪种情况下,它将使用配置的Validator进行验证   实例。使用MVC命名空间或MVC Java配置时,a   假设JSR-303,JSR-303验证器自动配置   实现在类路径上可用。

     

就像使用@ModelAttribute参数一样,可以使用Errors参数   用来检查错误。如果没有宣布这样的论证,a   将引发MethodArgumentNotValidException。例外是   在DefaultHandlerExceptionResolver中处理,它发送400   错误回到客户端。在你的'handleMethodArgumentNotValid&#39;之前   有机会开火,这是handndf

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

答案 1 :(得分:0)

  

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

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

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

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

答案 2 :(得分:-1)

@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