在尝试使用 Bean Validation (JSR-303) 自定义约束时,使用此处所述的注释和 XML 配置,我在日志中收到以下错误,并且忽略了约束:
<Error> <org.hibernate.validator.xml.ValidationXmlParser> <BEA-000000> <Error parsing validation.xml: null>
我使用 Weblogic 12.1.1 作为应用程序服务器,并且我的应用程序被部署为一个 war 文件。
validation.xml和constraint-mapping.xml文件都放在 WEB-INF/classes/META-INF 下。
有人知道可能导致这种情况的原因吗?这是依赖还是冲突的库问题?
这是我的validation.xml:
<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
<default-provider>org.hibernate.validator.HibernateValidator</default-provider>
<constraint-mapping>META-INF/constraint-mapping.xml</constraint-mapping>
</validation-config>
还有我的constraint-mapping.xml:
<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
<constraint-definition annotation="foo.CustomConstraint">
<validated-by include-existing-validators="true">
<value>foo.CustomConstraintValidator</value>
</validated-by>
</constraint-definition>
</constraint-mappings>
提前致谢,
迪米特里斯
更新
在遵循 Gunnar 的建议后,我做了以下事情:
- 使用版本 4.3.1 覆盖 Weblogic 的默认休眠验证器 (4.1.0)
- 调试了 ValidationXmlParser 类。
这给了我以下例外:
javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 96;
SchemaLocation: schemaLocation value =
'http://jboss.org/xml/ns/javax/validation/configuration' must have even number of URI's.]
为了克服这个问题,我更新了validation.xml中的xsi:schemaLocation,如下所示:
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration
http://jboss.org/xml/ns/javax/validation/configuration/validation-configuration-1.0.xsd"
此更改修复了先前的错误,但我的注释继续被忽略。我在这里想念什么?