Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR

Posted

技术标签:

【中文标题】Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR【英文标题】:Java Bean Validation 2.0 Hibernate Validator - Executable JAR with external XML-Configuration 【发布时间】:2020-04-10 04:28:16 【问题描述】:

上下文

我正在开发一个从 csv 文件读取输入数据的独立应用程序。 到目前为止,我一直使用自写的类来执行输入验证, 并触发了用于验证输入文件中的单个记录的方法 读完一行后立即。该方法在读取 csv 文件的方法中被调用。

由于未来将使用 RESTful Web Services 检索输入数据 我们将放弃使用 csv 文件,我想将验证与 csv 读取分离。

我偶然发现了 Bean Validation (JSR 380) 并使用 Hibernate Validator 重构了验证过程。

我都尝试了,直接向 Bean 类添加验证注释,并使用 validation.xml 文件进行配置。 当我从 Eclipse 运行应用程序时,这两种方法都有效。

问题

应用程序将部署为可执行 JAR。 我想保留更改验证约束的选项,而无需重新打包和重新部署 JAR。 所以我想弄清楚,是否有办法从 JAR 中排除 validation.xml(+ 其他配置文件)并将其放在 JAR“接近”的某个目录中。 像这样的:

myApp/
 |-- JAR
 |-- conf/
     |-- ValidationMessages.properties
     |-- META-INF/
          |-- validation.xml
          |-- validation/
               |-- constraints-myBean.xml

我尝试了什么

    META-INF/-文件夹与 JAR 放在同一目录中

    JAR 运行,但验证不起作用。

    validation.xml中引用constraints-myBean.xml的绝对路径,具体改<constraint-mapping>META-INF/validation/constraints-pbpRecord.xml</constraint-mapping><constraint-mapping>C:/path/to/myApp/META-INF/validation/constraints-pbpRecord.xml</constraint-mapping> 并在我的 JAR 中包含 validation.xml

    A ValidationException 取消执行:

Exception in thread "main" javax.validation.ValidationException: HV000096: Unable to open input stream for mapping file C:/Users/wsteffler/Desktop/pbp_import_tool/pbp_orgunit_import/META-INF/validation/constraints-pbpRecord.xml.  
        at org.hibernate.validator.internal.xml.config.ValidationBootstrapParameters.setMappingStreams(ValidationBootstrapParameters.java:291)
        at org.hibernate.validator.internal.xml.config.ValidationBootstrapParameters.<init>(ValidationBootstrapParameters.java:67)
        at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.parseValidationXml(AbstractConfigurationImpl.java:595)
        at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.buildValidatorFactory(AbstractConfigurationImpl.java:376)
        at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
        at de.uniwuppertal.hisinone.orgunitimport.pbp.Main.main(Main.java:220)
    META-INF/ 的父目录添加到类路径(使用-classpath 参数)

    JAR 运行,但验证不起作用。

我已经阅读了Bean Validation specification(6.5. Bootstrapping & 9. XML 部署描述符)和Hibernate Validator 6.1.0 Reference Guide(8. 通过 XML 配置),特别是在括号中的章节中寻找解决方案,并在 *** 和谷歌寻求解决方案。不幸的是,到目前为止,我还没有找到任何可以让我找到解决方案的方法。

是否有可能在执行 JAR 时实现引导外部validation.xml? 如果是,我该如何实现?

如果您需要我的代码中的更多信息或部分内容,我将使用所需信息更新问题。

【问题讨论】:

【参考方案1】:

Hibernate Validator 显然不支持这一点。当然validation.xml 需要在罐子里。我们也许可以支持使用file: 前缀来指向外部约束映射。如果您愿意为此工作,我会接受补丁。

但不确定资源包,所以这对您来说是一个半生不熟的解决方案。

我想知道您是否可以只传递一个精心设计的类加载器,该类加载器可以从您的外部位置加载资源(并将其他所有内容委托给标准类加载器)并在配置 ValidatorFactory 时使用 externalClassLoader(ClassLoader) 将其传递给 HV .

【讨论】:

非常感谢您的回答并澄清现在不可能。我仍然是一个新手开发人员,我对类加载器一点也不熟悉,所以我想我会尝试其他方法来实现我的目标。谢谢你的想法!我不认为我会在不久的将来为这个功能开发补丁。我在空闲时间几乎不写代码,而且我认为我的上级不会希望我在工作中这样做;)如果将来我很想为开源项目做出贡献,我可能会回来。

以上是关于Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0:在JPA 2.0中使用javax.validation。*包的例外

Java bean validation 规范与参考实现

启用Bean验证2.0?

Java参数验证Bean Validation 框架

Java Bean Validation 最佳实践

Java Bean Validation 最佳实践