对列表和列表元素进行Jsr 303验证

时间:2012-06-08 14:43:37

标签: bean-validation

我正在努力定义我的jsr 303验证规则,即重新定义我的容器bean的默认组。

@GroupSequence({Container.class, Container.Step2.class})
public class Container {
@NotNull
private String def;

@Valid
@Size(min = 20, groups = Container.Step2.class)
private List<Element> elems = new LinkedList<Element>();

public interface Step2{}
}

public class Element{
@NotNull
private String foo;
}

当且仅当:

时,我想验证容器bean的大小
  • def属性有效
  • 没有任何带有elems集合的Elements bean的验证错误

如果我使用默认组验证Container:

Container c = new Container();
...
validator.validate(c)
即使内部元素bean存在验证错误,也会触发

大小验证程序。

如果我从容器类中删除@GroupSequence(跳过重新定义Container的默认组)并将自己的GroupSequence定义为:

@GroupSequence({Default.class, Container2.Step2.class}) 
public interface AllValid{}

然后使用AllValid组进行验证:

Container c = new Container();
...
validator.validate(c, Container2.AllValid.class);

一切都按预期工作。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我决定查看一下hibernate-validator的源代码来调查这个问题。看起来在验证root bean之后执行关联的级联验证。两个验证(根bean和关联的验证)都使用“目标组”执行。 “目标组”是指你作为验证方法的最后一个参数传递的组。如果没有传递组/组参数,则将“默认组”设置为“目标组”。在我的例子中,我重新定义了root bean的默认组,因此请调用:

validator.validate(c)

强制使用组序列验证Container bean:Default,Container.Step2.class。在验证elems列表之后(使用默认组)。在这种情况下,Container和elems是独立验证的。

如果有人知道让我的验证工作在默认组中的任何技巧,请评论我的帖子但是现在我将继续验证具有明确组的容器,即

validator.validate(c, Container2.AllValid.class);