如果放在库 jar 中,则 Bean 验证配置不会被拾取

Bean validation configuration not picked up if placed in library jar

我在 Java EE 7 Web 应用程序中使用 Bean Validation 1.1。验证工作正常,但我很难让它在 Wildfly 和 Liberty 上工作。

我已经通过 validation.xml 配置了一个自定义消息插值器,它被放置在库 jar 中:

ROOT
|-- WEB-INF
    |-- lib
        |-- my-validation.jar
            |-- mypackage
                |-- MyMessageInterpolator.class
            |-- META-INF
                |--validation.xml

当部署到 Wildfly 14 时,一切都按预期工作。然而,在 Liberty 19 上,MyMessageInterpolator 被发现, 但在验证期间未被调用 (例如,在 REST 资源中使用 @Valid 时)。

然后我将 validation.xml 直接移动到网络应用程序中(不移动消息插值器本身):

ROOT
|-- WEB-INF
    |-- classes
        |-- META-INF
            |-- validation.xml
    |-- lib
        |-- my-validation.jar
            |-- mypackage
                |-- MyMessageInterpolator.class

这是在 Liberty 上工作,但我希望它在 validation.xml 放在库 jar 中时也能工作。 Bean Validation 1.1 spec 表示:

Unless explicitly ignored [...], a Configuration takes into account the configuration available in META-INF/validation.xml.

我在这里错过了什么?

这似乎按预期工作。 BeanValidation 规范在 JavaEE 或 JavaSE 环境中工作,因此当它说 META-INF/validation.xml 时,通常是相对于 JavaEE 环境中的 WEB-INF/classes/

为了比较,如果你想在.war模块中使用JPA的persistence.xml,你需要把它放在WEB-INF/classes/META-INF/persistence.xml。与 CDI 的 beans.xml 相同,它在 .war 模块中进入 WEB-INF/classes/beans.xml

在其他地方也可能允许,但据我所知支持其他位置未由规范定义。

我同意 Andy 对 Liberty 默认行为的回答。但是,可以配置 属性、com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp 以获得您正在寻找的行为。通过设置 com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp=false(默认为 true),整个应用程序将扫描单个 META-INF/validation.xml 并应用于所有模块。这样做的缺点是您的应用程序中只能定义一个 validation.xml。如果发现多个,则会发生部署错误。

有关设置此 属性 的更多详细信息,请参阅以下链接:

https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/rwlp_restrict.html#rwlp_restrict__BeanvalidationFeatureRestrict

http://www-01.ibm.com/support/docview.wss?uid=swg1PI43130