如果放在库 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。如果发现多个,则会发生部署错误。
有关设置此 属性 的更多详细信息,请参阅以下链接:
我在 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 inMETA-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。如果发现多个,则会发生部署错误。
有关设置此 属性 的更多详细信息,请参阅以下链接: