Spring中@Valid和@Validated之间的区别


106

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) {

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

JSR-303的Valid的变体,支持验证组的规范。设计用于方便使用Spring的JSR-303支持,但不适用于JSR-303。

这并没有太大帮助,因为它无法确切说明两者的不同之处。如果有的话。两者似乎都对我来说很好。



4
“支持验证组的规范”是一个非常明确的声明。
更好的Oliver,2016年

我应该认为Valid与JSR 303验证紧密结合在一起(NotNull等)。而您可以创建其他验证/组,并在“已验证”中将其选中。
Atul 2016年

@zeroflagL,是的,但是由于我从未使用过它,所以我错过了要点,而是将其固定在“非特定于JSR-303的部分”上。现在很清楚。
谢尔盖·塔切诺夫'16

Answers:


83

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

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

转到此jira票以查看注释是如何形成的。


112

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

@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非常简单地详细解释。
Gautam Tyagi

这正是我过去2个小时一直在搜索的内容,谢谢@ Zhuhang.jasper
Shady Hussein

谢谢@zhuhang。一直在寻找这个。
Vishnu Dahatonde

4

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

我们可以使用@Validated的方法级验证功能来使其正常工作。要做到这一点,关键是要放在@Validated课堂上。这可能是另一个重要区别@Valid,并@Validated在Spring框架。

提神


您能解释为什么注释对List对象无效吗?我认为这也不适用于其他收藏Map?也许你可以给我在我的问题更详细的解释:stackoverflow.com/questions/60167961/...
Theiaz

1
@Theiaz如您所愿
Lebecca

1

除上述内容外,您只能@Valid在域/字段上申请嵌套验证,而不能使用@validated

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.