我在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
中可用的配置。
我在这里想念什么?
答案 0 :(得分:1)
我同意安迪关于自由的默认行为的回答。但是,有一个属性com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp
,可以对其进行配置以获得所需的行为。通过设置com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp=false
(默认值为true),将扫描整个应用程序以查找单个META-INF/validation.xml
并将其应用于所有模块。缺点是在您的应用程序中只能定义一个validation.xml。如果发现多个部署错误,则会发生。
有关设置此属性的更多详细信息,请参见以下链接:
答案 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
中。
在其他地方也可以允许使用,但是据我所知,规范中并未定义支持其他位置的信息。