2012-07-25 71 views
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文件打包在耳边。我们不使用的版本1.6.2,可登录JBoss的7在JBoss中使用Hibernate验证器JodaTime bean验证约束条件

的模块,当与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库,而不是封装在ear文件中的Joda库。

我想我们正在做类错误的类加载。任何人都可以给我一个提示吗?

+0

使用JBoss自带的joda-time-1.6.2库我也无法使它工作。你能使它与1.6.2一起工作吗? – siebz0r 2012-07-25 14:47:42

+0

据我了解代码问题是一个类加载问题。由hibernate-validator缓存的可用类型已经由'org.hibernate.time'jboss模块的模块加载器加载,而作为验证输入提供的DateTime来自我的耳朵。即它已经被ear文件加载器加载了。因此对'Class.isAssignableFrom'的调用总是失败。不管它是乔达2.0还是1.6.2。由于我们使用2.0的特性,因此我们无法使用JBoss附带的Joda模块。 – woelfle 2012-07-26 07:08:49

回答

3

您是否试过在您的ear文件中添加一个jboss-deployment-structure.xml?这样,你应该能够排除乔达时间模块:

<?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

2

见下Hardy的想法,我解决我的问题,我的应用程序的WEB创建JBoss的部署,structure.xml -INF文件夹包含此:

<?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。我希望这也适合你。