Java 如果放在库jar中,则未拾取Bean验证配置
我正在JavaEE7Web应用程序中使用BeanValidation1.1。验证工作正常,但我很难让它在Wildfly和Liberty上工作 我已经通过validation.xml配置了一个自定义消息插值器,它被放置在库jar中:Java 如果放在库jar中,则未拾取Bean验证配置,java,jakarta-ee,bean-validation,websphere-liberty,Java,Jakarta Ee,Bean Validation,Websphere Liberty,我正在JavaEE7Web应用程序中使用BeanValidation1.1。验证工作正常,但我很难让它在Wildfly和Liberty上工作 我已经通过validation.xml配置了一个自定义消息插值器,它被放置在库jar中: ROOT |-- WEB-INF |-- lib |-- my-validation.jar |-- mypackage |-- MyMessageInterpolator.class
ROOT
|-- WEB-INF
|-- lib
|-- my-validation.jar
|-- mypackage
|-- MyMessageInterpolator.class
|-- META-INF
|--validation.xml
当部署到Wildfly 14时,一切正常。但是,在Liberty 19上找到了MyMessageInterpolator
,但在验证期间未调用(例如,在REST资源中使用@Valid
时)
然后我将validation.xml
直接移动到web应用程序中(不移动消息插入器本身):
这在Liberty上是可行的,但我希望它在validation.xml
放在库jar中时也能起作用。报告说:
除非明确忽略[…],否则配置将考虑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
中
在其他地方也可能允许这样做,但从我所看到的情况来看,支持其他位置并不是规范所定义的。我同意安迪关于自由默认行为的回答。但是,有一个属性,com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp
,可以对其进行配置,以获取所需的行为。通过设置com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp=false
(默认值为true),整个应用程序将被扫描为单个META-INF/validation.xml
,并应用于所有模块。这样做的缺点是应用程序中只能定义一个validation.xml。如果找到多个,将发生部署错误
有关设置此属性的详细信息,请参见以下链接:
将该属性设置为false解决了我的问题,但我仍然不明白为什么。据我所知,WEB-INF/lib/my-validation.jar/META-INF/validation.xml文件在WEB模块的类路径中与WEB-INF/classes/META-INF/validation.xml文件一样多,因此应该使用它。甚至PI43130的描述似乎也不太合适,因为它涉及应用程序(!)类路径中的多个validation.xml文件。然而,我在类路径中只有一个validation.xml,但它被忽略了。
ROOT
|-- WEB-INF
|-- classes
|-- META-INF
|-- validation.xml
|-- lib
|-- my-validation.jar
|-- mypackage
|-- MyMessageInterpolator.class