当前位置: 首页 > 知识库问答 >
问题:

jsr 303对列表和列表元素的验证

阎佑运
2023-03-14

我正在努力定义JSR303验证规则,即重新定义容器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属性有效
  • 使用elem集合的任何元素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);

一切正常。有什么想法吗?

共有1个答案

全弘深
2023-03-14

我决定研究一下hibernate validator的源代码来调查这个问题。它看起来像是在验证根bean之后执行关联的级联验证。这两种验证(根bean和关联的验证)都是通过“目标组”执行的。我所说的“目标群体”是指作为验证方法的最后一个参数传递的群体。如果未传递组/组参数,“默认组”设置为“目标组”。在我的例子中,我重新定义了根bean的默认组,因此调用:

validator.validate(c)

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

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

validator.validate(c, Container2.AllValid.class);
 类似资料:
  • 表达式API由一系列类组成,每个类表示SQL字符串中的特定词汇元素。它们组合成一个更大的结构,形成一个语句结构 编译的 转换为可以传递给数据库的字符串表示形式。这些类被组织成一个从最底层开始的层次结构 ClauseElement 班级。关键子类包括 ColumnElement ,它表示SQL语句中任何基于列的表达式的角色,例如在columns子句、WHERE子句和ORDER BY子句中,以及 Fr

  • 问题内容: 我知道可以将一个列表连接成一个长字符串,如下所示: 显然,这将输出: 但是,我想做的就是简单地将列表中的第一个和第二个字符串连接起来,然后连接第三个和第四个字符串,依此类推。简而言之,从上面的示例中取而代之的是: 有没有简单的方法可以做到这一点?我可能还应该提到,列表中字符串的长度以及列表中字符串的数量都是不可预测的,尽管字符串的数量始终是偶数。因此原始列表也可能是: 问题答案: 您可

  • HTML 包含专门用于创建列表的元素,共有 3 种类型的列表,分别是无序列表、有序列表、描述列表。 可以在一个列表中其他另外一个或者多个列表,并且,一种类型的列表可以与任意类型的列表相互嵌套。列表的表项可以与任何HTML元素(如段落、图片、链接等)交叉定义。 所有的列表都是由父元素和子元素构成,父元素用于指定要创建的列表类型,子元素用于指定要创建的列表项。 无序列表 无序列表,是指所有表项之间没有

  • 问题内容: 我可以验证列表中的一个元素,但是下拉菜单中有20个元素需要验证,我不想使用上述逻辑20次。有没有更简单的方法可以做到? 问题答案: 不要使用for-each构造。仅在对单个/数组进行迭代时有用。您需要同时遍历和数组。 OP稍微改变了他的问题后进行编辑: 假设您有一组期望值,则可以执行以下操作: 这段代码实质上完成了我的第一个代码。唯一的区别是,现在您手动进行工作并打印结果。 以前,我使

  • 问题内容: 假设我有3个列表:[‘q’,’w’],[‘a’,’s’],[‘z’,’x’]。如何从这些列表中获取可能的组合列表?所以我得到一个列表[[‘q’,’a’,’z’],[‘q’,’s’,’z’]]等。我为两个方法创建了一个方法,但对N个列表却找不到一个方法: 我发现这是由番石榴的Sets.cartesianProduct完成的。 问题答案: 您需要N个嵌套循环,这使它变得很难。 您可以使用递

  • 我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。