26

一个字段有两个验证注解

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

观察

如果该字段留空,则产生的违规按顺序变化:

  • 有时@NotEmpty首先违反
  • 其他时候@Length首先违反

问题

Hibernate如何指定处理验证(注释)的顺序?可以自定义此验证顺序吗?

提前致谢。

4

2 回答 2

34

使用 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将首先验证默认约束,如果没有遇到违反约束的情况,它将转到扩展组。

于 2011-04-07T05:45:20.377 回答
4

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

假设我们有两个接口

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 测试的验证器。

于 2021-02-18T16:57:20.057 回答