【问题标题】:Jsr 303 validation on list and list elements列表和列表元素的 Jsr 303 验证
【发布时间】:2012-06-08 14:43:37
【问题描述】:

我正在努力定义我的 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 c = new Container();
...
validator.validate(c)

即使内部元素 bean 存在验证错误,也会触发大小验证器。

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

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

然后使用 AllValid 组进行验证:

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

一切都按预期进行。 有什么想法吗?

【问题讨论】:

    标签: bean-validation


    【解决方案1】:

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

    validator.validate(c)
    

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

    如果有人知道使我的验证与默认组一起工作的任何技巧,请评论我的帖子,但现在我将继续使用显式组验证容器,即

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

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 2013-12-27
      • 2013-12-21
      • 1970-01-01
      • 2015-01-10
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多