一个字段有两个验证注解
@NotEmpty
@Length(min=3,max=100)
String firstName;
观察
如果该字段留空,则产生的违规按顺序变化:
- 有时
@NotEmpty
首先违反 - 其他时候
@Length
首先违反
问题
Hibernate如何指定处理验证(注释)的顺序?可以自定义此验证顺序吗?
提前致谢。
一个字段有两个验证注解
@NotEmpty
@Length(min=3,max=100)
String firstName;
如果该字段留空,则产生的违规按顺序变化:
@NotEmpty
首先违反@Length
首先违反Hibernate如何指定处理验证(注释)的顺序?可以自定义此验证顺序吗?
提前致谢。
使用 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
将首先验证默认约束,如果没有遇到违反约束的情况,它将转到扩展组。
只是为了添加到上述答案,组序列也可以在已定义验证的类级别完成。例如:
假设我们有两个接口
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 测试的验证器。