我有一个有两个验证注释的字段
@NotEmpty
@Length(min=3,max=100)
String firstName;
我只是想知道hibernate如何指定首先执行验证注释的顺序,以及是否可以自定义?
我问的原因是,如果我将该字段留空,有时显示的第一个验证消息是非空的,有时如果我将其留空,我会得到长度注释的验证消息。
提前感谢。
答案 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 测试的验证器。