2017-04-05 71 views
0

與Hibernate驗證問題由Hibernate 3升級到4彈簧4與Hibernate驗證問題4

後由Hibernate 3升級到4春天后,我接手一個很老的Java項目(富客戶端,鞦韆,冬眠3)具有某種本土依賴注入,使用Hibernate 3,它有手動事務管理。意思是每個怪異的DAO方法都會得到一個觸發會話被打開或不被打開的布爾值。你可以想象當你在很多地方碰到那個脆弱的構造時,這意味着什麼......總之,我不是在這裏發牢騷......這是我的問題:

我必須實現一個新的複雜功能,並且很快必須實現這整個手動交易的事情失去控制,我可以說服客戶重構整個事情使用春交易管理與休眠4組合。

所以我開始實施這個,並在我遇到一些重大問題後,整個事情現在運行,但有一些更詳細的hickups。

一個驅動我的堅果是休眠驗證器。現在的實現是我猜測的老式方式。所有實體類都來自名爲DomainObject的類,其中包含項目中現有的所有實體的org.hibernate.validator.ClassValidator。 在實體本身中,將使用.InvalidValues()調用此驗證器來驗證字段。

由於我使用Spring 4.2.4.RELEASE升級到Hibernate-Core 4.3.6.Final當實體需要驗證時,我遇到了很多問題。我知道我正在使用一箇舊的驗證器版本,但當我升級到更高版本時,整個項目有無數的錯誤,如The type org.hibernate.validator.InvalidValue cannot be resolved. It is indirectly referenced from required .class files,但我無法解決這個問題,我找到了它的所有答案。

眼下這會導致錯誤的驗證在SwingWorker Thread運行,同時調試它,我可以看到異常吞嚥某處深春,我甚至不得到一個堆棧跟蹤:-( 我假設的問題仍然來自休眠依賴的糟糕的組合,但我真的絕望了,直到我一起工作的這 你可以看到在pom.xml以下摘錄的東西。

這裏摘錄

<!-- Hibernate Stuff --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.6.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.5.6-Final</version> 
    <!-- Hibernate Core needs a higher version so we exclude this one --> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-commons-annotations</artifactId> 
       <version>3.2.0.Final</version> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
     <version>1.0.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>4.3.2.Final</version> 
    </dependency> 
<!--  <dependency> --> 
<!--   <groupId>org.hibernate</groupId> --> 
<!--   <artifactId>hibernate-c3p0</artifactId> --> 
<!--   <version>3.6.10.Final</version> --> 
<!--  </dependency> --> 
<!--  <dependency> --> 
<!--   <groupId>javassist</groupId> --> 
<!--   <artifactId>javassist</artifactId> --> 
<!--   <version>3.12.0.GA</version> --> 
<!--  </dependency> --> 

<!--  <dependency> --> 
<!--   <groupId>c3p0</groupId> --> 
<!--   <artifactId>c3p0</artifactId> --> 
<!--   <version>0.9.1.2</version> --> 
<!--  </dependency> --> 

這是我在驗證過程中將調用所有實體。

/** 
* validate the entity. This method will be called internally before save or 
* update to check validity before sql statements 
*/ 
@Override 
@Transient 
protected InvalidValue[] validate(final String fieldName) { 
    if (fieldName == null) { 
     return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this); 
    } else { 
     return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this, fieldName); 
    } 
} 

任何提示?如果你需要更多的代碼,告訴我。整個Spring和Hibernate配置都是用Java完成的。沒有xml。

+0

'InvalidValue'不Hibernate驗證4存在,後來,也就是你必須去適應「中,將驗證過程中可以調用所有實體的方法」,因此它的使用當前版本的Hibernate Validator(或實際的Bean Validation,這是Hibernate Validator從版本4開始實現的規範)。 – Gunnar

+0

@Gunnar是啊,這是我的預期。所以我開始(只是爲了看看它是否有幫助)在所有實體中停用每一個驗證方法,並且瞧...現在,這些奇怪的錯誤消失了。但要真正實現Hibernate Validation,使用版本4的註釋驅動方式將需要更多時間: - /。你知道一個關於使用hibernate validator 4 with spring的最佳實踐的好教程嗎? – m0rb

+0

給其他人一些達到這個問題的提示:我現在完成了HV的新實現,並且一個很好的指導是[This](http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single /#section-constraint-composition)和[that](http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#section-obtaining-validator )。基本上H-V 3和4的實現並沒有那麼不同。我只是沒有看到所有的自定義驗證器是驅使我瘋狂的部分;-) – m0rb

回答

0

我用一點小小的解決方法解決了這個問題。把這個在你的pom.xml

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator-legacy</artifactId> 
    <version>4.0.2.GA</version> 
</dependency> 
+0

感謝您的答案@KimTiagoBaptista。其實不是依賴,而是執行是問題。例如。 H-V4的驗證方法在H-V3中返回一組'javax.validation.ConstraintViolation '而不是'org.hibernate.validator.InvalidValue'數組,但它在上下文方面做了相同的處理。更嘮叨的事情是,H-V4在春季交易管理方面造成了一些奇怪的問題,但這是另一個長長的故事。 – m0rb