在JBoss中使用hibernate验证器JodaTime bean验证约束

时间:2012-07-25 11:45:03

标签: jboss7.x jodatime hibernate-validator

我们有一个使用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附带的Joda库。包含在我们的ear文件中的库。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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.hibernate.validator ,而不是排除 org.joda.time 。我希望这也适合你。