控制验证注释顺序?

问题描述 投票:0回答:2

一个字段有两个验证注释

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

观察

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

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

问题

Hibernate如何指定处理验证(注释)的顺序? 这个验证顺序可以定制吗?

提前致谢。

operator-precedence hibernate-validator
2个回答
38
投票
使用 JSR-303 验证组。

如果未指定组,则约束是默认 Bean 验证组的一部分(请参阅:

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

的指定,将首先验证默认约束,如果没有遇到约束违规,它将移至扩展组。


12
投票
仅补充上述答案,组序列也可以在已定义验证的类级别完成。 例如:

假设我们有两个接口

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 测试。

© www.soinside.com 2019 - 2024. All rights reserved.