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。
这没有多大帮助,因为它并没有确切地说明它是如何不同的。如果有的话。两者似乎都对我很好。
答案 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
没有区别。但是,如果@RequestBody
用List
对象注释,或者是用@RequestParam
注释的字符串值,则验证将不会生效。
我们可以使用@Validated
的方法级验证功能来使其工作。为此,关键是将@Validated
放在班上。这可能是Spring框架中@Valid
和@Validated
之间的另一个重要区别。
引用