【问题标题】:validating that a field is unique using Bean Validation (or JSF)使用 Bean Validation(或 JSF)验证字段是否唯一
【发布时间】:2013-03-07 12:07:37
【问题描述】:

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

public class Foo {

    private String name

}

网站上的每个用户最多可以有 10 个 Foo 与之关联。在这种情况下,当创建一个新的 Foo 时,我想验证没有另一个 foo 与已经存在的同一个用户关联。

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

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

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

@AssertTrue(message="Name already exists")
public boolean isNameUnique() {
    return (existingNames.contains(name));
}

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

这让我想到了这个问题:

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

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

编辑以回应哈代:

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

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

【问题讨论】:

    标签: java-ee-6 bean-validation


    【解决方案1】:

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

    【讨论】:

    • 我必须插入接缝验证,这样我才能在 ConstraintValidator 中获得 CDI,但这基本上是我最终寻求的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多