春天的@Valid和@Validated之间的区别

时间:2016-03-23 08:41:08

标签: java spring validation spring-mvc

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的变体有效,支持验证规范   组。专为方便使用Spring的JSR-303支持而设计   不是特定于JSR-303。

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

4 个答案:

答案 0 :(得分:54)

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

为什么没有将这个添加到@Valid注释中是因为它使用java社区进程(JSR-303)标准化,这需要时间,而Spring开发人员希望允许人们更快地使用此功能

转到this jira ticket查看注释是如何形成的。

答案 1 :(得分:34)

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

用于@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;

}

答案 2 :(得分:0)

此外,您只能在域/字段上应用@Valid进行嵌套验证,而不能使用@validated

答案 3 :(得分:0)

在问题的示例代码段中,@Valid@Validated没有区别。但是,如果@RequestBodyList对象注释,或者是用@RequestParam注释的字符串值,则验证将不会生效。

我们可以使用@Validated的方法级验证功能来使其工作。为此,关键是将@Validated放在班上。这可能是Spring框架中@Valid@Validated之间的另一个重要区别。

引用