控制验证注释顺序?

Mah*_*leh 14 spring hibernate spring-mvc hibernate-validator

我有一个具有两个验证注释的字段

@NotEmpty
@Length(min=3,max=100)
String firstName;
Run Code Online (Sandbox Code Playgroud)

我只是想知道hibernate如何指定首先执行验证注释的顺序,以及是否可以自定义?

我问的原因是,如果我将该字段留空,有时显示的第一个验证消息是非空的,有时如果我将其留空,则获得长度注释的验证消息.

提前致谢.

Wil*_*leu 19

使用JSR-303验证组.

如果未指定任何组,则约束是Default Bean Validation组的一部分(请参阅:)javax.validation.groups.Default.

创建一个接口作为"扩展"(或任何你想称之为)的组:

public interface Extended{}
Run Code Online (Sandbox Code Playgroud)

现在创建一个具有javax.validation.GroupSequence注释的接口.

@GroupSequence({Default.class, Extended.class})
public interface MySequence {}
Run Code Online (Sandbox Code Playgroud)

根据约束设置验证组

@NotEmpty // If no group is specified it is part of the default group
@Length(min=3,max=100, groups = Extended.class)
String firstName;
Run Code Online (Sandbox Code Playgroud)

将MySequence传递给验证者呼叫.

validator.validate(object, MySequence.class);
Run Code Online (Sandbox Code Playgroud)

根据您@GroupSequence的指定,将首先验证默认约束,如果没有遇到绑定违规,它将转移到扩展组.

  • 我正在使用 @valid 注释,还有其他想法吗? (3认同)
  • 恐怕我认为你必须等待 https://jira.springsource.org/browse/SPR-6373 才能解决(或者自己调用验证器)。也看看这篇文章:http://digitaljoel.nerd-herders.com/2010/12/28/spring-mvc-and-jsr-303-validation-groups/ (2认同)

Rad*_*ive 12

只是为了补充上面的答案,组序列也可以在已定义验证的类级别完成。例如:

假设我们有两个接口

public interface FirstOrder{}
public interface SecondOrder{}
Run Code Online (Sandbox Code Playgroud)

我们可以将它们定义为一个组序列,如下所示

@GroupSequence({MyTestClass.class,FirstOrder.class,SecondOrder.class})
public class MyTestClass{

@NotBlank(groups = FirstOrder.class)    
@Length(min=3, max=100, groups = SecondOrder.class)
private String name; 

}
Run Code Online (Sandbox Code Playgroud)

以这种方式进行组序列的优点是 -

您不需要额外的接口来定义组序列,因此您不需要将其传递给单元/IT 测试的验证器。