春季“ Valid”与“ Valated”的区别

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 是 确认,有效,@Valated 是 批注,已验证

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

这没什么用,因为它不能准确说明它有什么不同。如果有的话。我觉得两者都很不错。

117867 次浏览

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

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

转到 这张吉拉票查看注释是如何产生的。

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

@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/valid- groups-in-spring-mvc.html”rel = “ norefrer”> 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;


}

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

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

我们可以使用 @Validated的方法级验证功能来使其工作。要实现这一点,关键是在类上放置 @Validated。这可能是 @Valid@Validated在弹簧框架中的另一个重要区别。

参考文献

@Validated可用于类:

@Validated
public class Person {
@Size(min=3)
private String name;
...

只是为了简化:

@Validated注释是一个类级别的注释,我们可以使用它来告诉 Spring验证传递到注释类的方法中的参数。

还有

对方法参数和字段的 @Valid注释,告诉 Spring我们需要验证方法参数或字段。

希望这个能帮上忙。