Spring中@Valid和@Validated的区别

新手上路,请多包涵

Spring 支持两种不同的验证方法:Spring 验证和 JSR-303 bean 验证。两者都可以通过定义一个 Spring 验证器来使用,该验证器委托给包括 bean 验证器在内的其他委托器。到目前为止,一切都很好。

但是当注释方法以实际请求验证时,那就是另一回事了。我可以这样注释

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

或者像这样

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

在这里,@Valid 是 javax.validation.Valid ,@Validated 是 org.springframework.validation.annotation.Validated 。后者的文档说

JSR-303 Valid 的变体,支持验证组的规范。专为方便使用 Spring 的 JSR-303 支持而不是特定于 JSR-303 而设计。

这没有多大帮助,因为它没有确切说明它有何不同。如果有的话。两者似乎对我来说都很好。

原文由 Sergei Tachenov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 482
2 个回答

正如您从文档中引用的那样,添加了 @Validated 以支持“验证组”,即验证 bean 中的字段组。这可以用于多步骤表单,您可以在第一步中验证姓名、电子邮件等,然后在后续步骤中验证其他字段。

之所以没有将其添加到 @Valid 注释中,是因为它是使用 java 社区流程 (JSR-303) 进行标准化的,这需要时间,而 Spring 开发人员希望让人们更快地使用此功能。

转到 这个 jira ticket 看看注释是如何产生的。

原文由 František Hartman 发布,翻译遵循 CC BY-SA 3.0 许可协议

一个更直接的答案。对于那些仍然不知道 “验证组” 到底是什么的人。

用于 @Valid 验证

控制器:

 @RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

表单对象:

 public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}


@Validated 验证组的用法

来源:http: //blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

控制器:

 @RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

表单对象:

 public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

原文由 zhuhang.jasper 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题