【问题标题】:Using @BindingResult with @Validated将@BindingResult 与@Validated 一起使用
【发布时间】:2019-07-03 18:48:05
【问题描述】:

注意: 当我搜索@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
        }
    }
}

所以如果我使用@Validated,BindingResult 一点用处都没有? 或者甚至只是简单地说@Validated 与@Valid 有何不同

【问题讨论】:

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


    【解决方案1】:

    见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
            }
        }
    
    }
    

    【讨论】:

    • 您提到的链接在我阅读时已经在我的问题上。您所说的解决方案有效,但我的问题是,如果我在类级别上使用验证并在方法上有效,那么javax.validation.ConstraintViolationException 会发生什么。我确定我在这里遗漏了一些东西。
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多