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

标签 java validation bean-validation hibernate-validator jsr380

上下文

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

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

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

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

问题

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

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

我尝试过的

  1. 放置 META-INF/ -与 JAR 位于同一目录中的文件夹

    The JAR runs, but the validation doesn't work.

  2. 引用 constraints-myBean.xml 的绝对路径在validation.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>
    包括validation.xml在我的 jar 里。

    A ValidationException cancels the execution:

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 参数)

    The JAR runs, but the validation doesn't work.

  • 我已阅读Bean Validation specification (6.5. 引导和 9. XML 部署描述符)和 Hibernate Validator 6.1.0 Reference Guide (8.通过XML配置),特意寻找括号内章节的解决方案,并在StackOverflow和Google上搜索了解决方案。不幸的是,到目前为止我还没有找到任何可以引导我找到解决方案的东西。

    是否有可能实现引导外部validation.xml执行 JAR 时?
    如果是的话,我怎样才能实现这个目标?

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

    最佳答案

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

    但不确定资源包,因此这对您来说是一个半成品的解决方案。

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

    关于Java Bean Validation 2.0 Hibernate Validator - 具有外部 XML 配置的可执行 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59378135/

    相关文章:

    java - 在 JLabel 扩展类中找不到符号

    java - 创建 Java Web 服务客户端

    validation - 通过 REST API 验证/更改密码

    bean-validation - JSR-303 如何有时忽略对 bean 中特定字段的验证

    java - IntelliJ Idea 中的 Bean 验证

    java - 如何对字符串大小设置验证 = 0 或 min=5,max=10?

    java - 我的 Hashmap 对象值列表对象仅返回我放入 ArrayList<Map<String,Object>>>(); 中的最后一个对象;

    java - 在不同的 Maven 模块中测试多个实现?

    ajax - 在codeigniter中使用jquery ajax进行表单验证

    html - W3C 验证错误