控制验证注释顺序?

时间:2011-04-06 18:29:19

标签: hibernate spring spring-mvc hibernate-validator

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

@NotEmpty
@Length(min=3,max=100)
String firstName;

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

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

提前感谢。

2 个答案:

答案 0 :(得分:18)

使用JSR-303验证组。

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

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

public interface Extended{}

现在创建一个具有javax.validation.GroupSequence注释的界面。

@GroupSequence({Default.class, Extended.class})
public interface MySequence {}

在约束

上设置验证组
@NotEmpty // If no group is specified it is part of the default group
@Length(min=3,max=100, groups = Extended.class)
String firstName;

将MySequence传递给验证者电话。

validator.validate(object, MySequence.class);

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

答案 1 :(得分:3)

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

假设我们有两个接口

public interface FirstOrder{}
public interface SecondOrder{}

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

@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; 

}

这样做的好处是——

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