使用Bean Validation(或JSF)验证字段是唯一的

时间:2013-03-07 12:07:37

标签: java-ee-6 bean-validation

我有一个名为

的简单对象
public class Foo {

    private String name

}

网站上的每个用户最多可与10个Foo相关联。在此上下文中,当创建新的Foo时,我想验证没有与已存在的同一用户关联的另一个foo。

我可以Create a custom Bean Validator但是注释要求在编译期间定义参数。 我如何传递现有Foos的名称?

正如在各个地方所建议的那样,我可以使用 EL表达式作为获取数据的替代方法。这感觉就像用大锤敲打坚果一样。它还带来了一大堆潜在的问题,最重要的是考虑到易于测试。

我可以使用布尔字段

进行类范围的验证
@AssertTrue(message="Name already exists")
public boolean isNameUnique() {
    return (existingNames.contains(name));
}

但验证消息不会显示在名称字段旁边。这是一个美容问题,这可以作为备份计划。但是,它并不理想。

这让我想到了这个问题:

是否有一种简单的方法来编写Bean Validator,可以在字段级别检查值集合并满足以下限制?

  • 以前在运行时确定的值
  • 不使用EL表达式
  • 字段级别验证,而不是类级别。

编辑回应哈代:

Foo类是一个持久存储在数据库中的实体。它们被拾取并通过DAO接口使用。

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

1 个答案:

答案 0 :(得分:0)

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