【问题标题】:Control validation annotations order?控制验证注释顺序?
【发布时间】:2011-04-06 18:29:19
【问题描述】:

一个字段有两个验证注解

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

观察

如果该字段为空,则结果违规的顺序会有所不同:

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

问题

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

提前致谢。

【问题讨论】:

  • 这是一个关于 bean-validation 的非常值得怀疑的观察结果。

标签: operator-precedence hibernate-validator


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

假设我们有两个接口

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多