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

问题描述 投票:1回答:2

我在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直接移动到web应用程序中(不移动消息插入器本身):

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

这正在开发Liberty,但是当validation.xml被放置在库jar中时,我希望它也可以工作。 Bean Validation 1.1 spec说:

除非明确忽略[...],否则Configuration会考虑META-INF/validation.xml中可用的配置。

我在这里错过了什么?

java java-ee bean-validation websphere-liberty
2个回答
1
投票

我同意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


0
投票

这似乎按预期工作。 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中。

它也可能在其他地方被允许,但从我所看到的支持其他位置的内容不是由规范定义的。

© www.soinside.com 2019 - 2024. All rights reserved.