我在 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说:
Unless explicitly ignored [...], a
Configuration
takes into account the configuration available inMETA-INF/validation.xml
.
我在这里缺少什么?
最佳答案
我同意 Andy 对 Liberty 默认行为的回答。不过,有一个属性 com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp
,可以配置它以获得您正在寻找的行为。通过设置 com.ibm.ws.beanvalidation.allowMultipleConfigsPerApp=false(默认值为 true),将扫描整个应用程序以查找单个 META-INF/validation.xml
并应用于所有模块。这样做的缺点是您的应用程序中只能定义一个validation.xml。如果发现多个,则会发生部署错误。
有关设置此属性的更多详细信息,请参阅以下链接:
关于java - 如果放置在库 jar 中,则不会拾取 Bean 验证配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55455014/