5

我们有一个使用 Joda DateTime 库的企业应用程序。该应用程序被部署到一个 JBoss 7.2.0 Alpha1 容器中。我们领域模型中的某些类在 DateTime 类型的字段上具有 @Past 注释。为了验证这些约束,我们想使用 hibernate-validator 提供的约束验证器。因此,我们在我们的 ear 文件的 MANIFEST.MF 中添加了一个依赖 'org.hibernate.validator'。我们使用的是 Joda 库的 2.0 版。因此我们把joda-time-2.0.jar文件打包到了我们的耳朵里。我们没有使用作为 JBoss 7 模块提供的 1.6.2 版本

验证具有 DateTime 字段的对象时,会引发以下异常:

10:51:41,140 ERROR [org.acme.GlobalExceptionHandler] (EJB default - 10) Exception caught by global exception handler: javax.validation.UnexpectedTypeException: No validator could be found for type: org.joda.time.DateTime
at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:383) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:364) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:313) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:144) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final]

经过一些调试后,我们检测到在“ConstraintTree.findSuitableValidatorTypes”中对“TypeUtils.isAssignable(validatorType, type)”的调用失败,因为可用的验证器类型取自 JBoss 附带的 Joda 库,而不是 JBoss 附带的 Joda 库。打包在我们的ear文件中。

我想我们在类加载方面做错了。任何人都可以给我一个提示吗?

4

2 回答 2

3

您是否尝试将jboss-deployment-structure.xml添加到您的 ear 文件中?这样你应该能够排除 Joda 时间模块:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.joda.time"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

另请参阅https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

于 2012-07-26T14:03:53.440 回答
2

按照 Hardy 的想法,我解决了在应用程序的WEB-INF文件夹中创建jboss-deployment-structure.xml的问题,其中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.hibernate.validator" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

而不是排除org.joda.time我排除了org.hibernate.validator。我希望这也适用于你。

于 2012-07-26T16:29:07.450 回答