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

Ser*_*nov 80 java validation spring 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) {
Run Code Online (Sandbox Code Playgroud)

或者像这样

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

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

JSR-303的变体有效,支持验证组的规范.设计方便使用Spring的JSR-303支持,但不支持JSR-303特定.

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

Fra*_*man 65

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

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

转到这个jira票,看看注释是如何形成的.


zhu*_*per 63

一个更直接的答案.对于那些仍然不知道究竟是什么的"验证组".

@Valid验证用法

控制器:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}
Run Code Online (Sandbox Code Playgroud)

表单对象:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}
Run Code Online (Sandbox Code Playgroud)

@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) {...}
Run Code Online (Sandbox Code Playgroud)

表单对象:

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;

}
Run Code Online (Sandbox Code Playgroud)

  • 要牢记。\@Validated 不验证嵌套的 DTO,您需要将 \@Valid 放在这些嵌套字段(例如 Account#user)上,以便传播对它们的验证。 (2认同)

Mur*_*dız 11

只是为了简化:

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

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


Leb*_*cca 10

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

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

参考

  • 您能解释一下为什么注释对“List”对象没有影响吗?我认为这也不适用于其他集合,例如“Map”?也许您可以在我的问题中给我更详细的解释:/sf/ask/4211757301/ (2认同)