2012-07-25 56 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。我希望這也適合你。