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

时间:2019-04-01 12:21:36

标签: java java-ee bean-validation websphere-liberty

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

我已经通过validate.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中可用的配置。

我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

我同意安迪关于自由的默认行为的回答。但是,有一个属性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

答案 1 :(得分:0)

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

为了进行比较,如果要在.war模块中使用JPA的persistence.xml,则需要将其放在WEB-INF/classes/中。与CDI的beans.xml相同,后者位于.war模块的WEB-INF/classes/META-INF/persistence.xml中。

在其他地方也可以允许使用,但是据我所知,规范中并未定义支持其他位置的信息。