将@BindingResult与@Validated一起使用

时间:2019-07-03 18:48:05

标签: java spring-boot bean-validation spring-validator

注意: 我阅读了搜索@valid vs @validated时收到的几乎所有堆栈帖子,但找不到答案,因此我将其发布。

我很困惑@Validated在这里做什么。如果inputParms无效,则抛出javax.validation.ConstraintViolationException甚至不进入代码内部。但是,如果我将@Validated替换为@Valid,则不会引发异常,bindingResult.hasErrors()会捕获它。

@RestController
@Validated // what is this doing ??
public class MyRestController{
    @PostMapping(value="/my-data",produces= {MediaType.APPLICATION_JSON_UTF8_VALUE})
    public ResponseEntity<?> doSomething(@Valid @RequestBody MyInputParam inputParms,BindingResult bindingResult){
        if(bindingResult.hasErrors()) {
            //do something here
        }
    }
}

因此,如果我使用@ValidatedBindingResult根本没有用吗? 甚至只是@Validated@Valid

有何不同

1 个答案:

答案 0 :(得分:0)

请参见Difference between @Valid and @Validated in Spring

在您的特定情况下,问题是@Validated@Valid混合在一起。解决此问题的选项:

  • 删除类上声明的@Validated,并使用@Validated@Valid作为参数
  • 在两个地方(类和参数)同时使用@Valid@Validated
@RestController
public class MyRestController {

    @PostMapping(value = "/my-data", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
    public ResponseEntity<?> doSomething(@Validated @RequestBody MyInputParam inputParms, 
                                         BindingResult bindingResult) {
        if(bindingResult.hasErrors()) {
            //do something here
        }
    }

}