【问题标题】:Java model validationJava 模型验证
【发布时间】:2011-11-18 16:09:44
【问题描述】:

我们正在寻找一个 Java 库/系统/包,它不仅可以进行基本验证,还可以进行关系验证。我们需要能够表达基于多个相关实体的验证标准。

大多数验证模型 Spring Validation、JSR303 专门针对 bean 属性的验证。但我们需要一些可以跨越 bean 的东西。

我们的要求是提出一种验证模型状态的方法,同时将验证逻辑外部化到 Java 代码之外。

在上面的定义中,一个 Bean 只是一个 POJO,一个模型是相关 Bean 的集合。因此,例如,如果 Account 有一组 Addresses 并且 Account.countryOfResidence 设置为 USA,我希望有一个验证规则来确保所有 Addresses 中都有一个美国国家/地区。

因此,在将地址添加到帐户的“操作”期间,将启动验证以确保 Address.country 与 Account.countryOfResidence 相同。

我们正在研究 DRULES,但想看看是否有其他可用选项。

对如何进行有什么建议吗?

【问题讨论】:

  • 在您的上下文中,什么是模型,什么是“模型状态”,什么是验证?如果人们知道你在寻找什么,它可能会帮助他们找到答案。
  • 为什么要避免使用 Java 进行验证? Java 似乎是最有表现力的语言,它有很多可用的 API,并且可以轻松访问 Java 对象。
  • 你需要做什么样的“关系验证”?我怀疑你会找到任何预先制作的东西来做这样的事情,但你可能会在提到的 API 中编写自己的验证器。
  • 我更新了问题以阐明模型的含义。
  • 为什么需要“将验证逻辑从 java 代码中外部化”?我并不反对它——我通常可以猜到——但听听你的具体情况会很好。特别是 - 验证要求所表达的语言的元要求是什么。例如,“公众”等可读......

标签: java validation model relationship


【解决方案1】:

不确定这个项目有多活跃,但我前一段时间使用过它,它提供了执行您所描述的功能 - 看看它是否有帮助:

http://i-screen.org/docs/index.html

当然还有 Jess: http://www.jessrules.com/jess/

这也可能值得一看,尽管我对此了解不多。 弗拉德:http://www.sapia-oss.org/projects/vlad/

【讨论】:

  • Jess 的替代方案是以前称为 Drools 的 JBoss 项目。我不喜欢这些的是 1) XML; 2) 在单独文件中定义的验证规则; 3) 在单独的 XML 文件中定义的验证。
【解决方案2】:

我认为这可以在JSR 303 中使用ScriptAssert validatorcustom validator 来实现。

This question 有几个自定义跨字段验证器,可用作创建您自己的验证器的基础。

这里是@ScriptAssert 验证器的示例。

@ScriptAssert(lang="javascript", script="_this.countryOfResidence.equals(_this.address.country)")
// @ScriptAssert(lang="jexl", script="_this.countryOfResidence == _this.address.country")
public class Account {
    @NotNull @Valid
    private Address adddress;

    private String countryOfResidence;
}

public class Address {
    ...
    @NotNull
    private String country;
}

这肯定比自定义验证器少很多代码。


注意:验证器也可以在 XML 中创建(如果您采用这种方式)。

【讨论】:

    【解决方案3】:

    我对这个领域的可用功能感到失望 - 可能是因为我想要一个不可能的功能组合 - 吃蛋糕和吃蛋糕。所以这更像是一个冗长的评论,而不是,至少考虑一个答案。我将此问题标记为“最喜欢的”,希望其他人会指出我们的妙招。但我想房子里没有巫师。

    一种可能性是OCL,尤其是在相关 Eclipse 插件提供的支持下。我看过它并拒绝了它,因为它似乎不值得付出努力 - 但你的里程可能会有所不同。

    另一种可能性(也许!!!)是利用为BDD 编写的工具之一。然而,这些是为测试而编写的,而不是生产代码——“给定场景 x,我希望 y 发生”。我指的是之类的 easyb、jbehave 和cucumber 的cuke4duke 端口——尤其是easyb。我认为 jbehave 对你来说太重 Java 了,我还没有认真研究过 cucumber。

    如果你找到适合你的东西,请回来写下你自己的答案。请注意,您对此有 7 个赞和 4 个收藏 - enquiring minds want to know

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2019-01-11
      • 2017-08-16
      • 2014-01-07
      相关资源
      最近更新 更多