Java ee 6 使用Bean验证(或JSF)验证字段是否唯一

Java ee 6 使用Bean验证(或JSF)验证字段是否唯一,java-ee-6,bean-validation,Java Ee 6,Bean Validation,我有一个简单的对象,它有一个名字 public class Foo { private String name } 站点上的每个用户最多可以有10个Foo与之关联。在这个上下文中,当创建一个新的Foo时,我想验证是否没有另一个Foo与已经存在的同一个用户关联 我可以,但是注释要求在编译期间定义参数然后如何传递现有FOO的名称? 正如许多地方所建议的,我可以使用EL表达式作为提取数据的替代方法。这感觉就像用大锤敲开一颗坚果。它也带来了一大堆潜在的问题要考虑,最不容易测试。 我可以使用

我有一个简单的对象,它有一个名字

public class Foo {

    private String name

}
站点上的每个用户最多可以有10个Foo与之关联。在这个上下文中,当创建一个新的Foo时,我想验证是否没有另一个Foo与已经存在的同一个用户关联

我可以,但是注释要求在编译期间定义参数然后如何传递现有FOO的名称?

正如许多地方所建议的,我可以使用EL表达式作为提取数据的替代方法。这感觉就像用大锤敲开一颗坚果。它也带来了一大堆潜在的问题要考虑,最不容易测试。

我可以使用布尔字段进行类范围的验证

@AssertTrue(message="Name already exists")
public boolean isNameUnique() {
    return (existingNames.contains(name));
}
但是验证消息不会显示在名称字段旁边。这是一个表面问题,可以作为一个备用计划。然而,这并不理想

这就引出了一个问题:

有没有一种简单的方法来编写一个Bean验证器,该验证器可以根据字段级别的值集合检查值,并满足以下限制条件?

  • 运行时确定的先前值
  • 不使用EL表达式之类的东西
  • 字段级验证而不是类级验证。
编辑以响应Hardy:

Foo类是数据库中持久化的实体。它们是通过DAO接口获取和使用的


我可以循环遍历实体,但这意味着将DAO插入验证器,更不用说,如果我有另一个类也有此约束,我需要再次编写相同的东西

看看您希望如何使用Foo类会有所帮助。你能扩展你的示例代码吗?它们保存在Foo实例列表中。自定义约束似乎非常适合。为什么需要将任何参数传递给约束。我只需遍历foos并检查名称是否唯一

我必须插入seam验证,以便在
ConstraintValidator
中获得CDI,但这基本上就是我最终寻求的解决方案。