2012-05-07 47 views
4

我正在使用Spring-Data-JPA 1.0.3.RELEASE來管理我的ORM。使用注入的Spring數據JPA返回「NoSuchMethodError」

我的persistence.xml看起來是這樣的:

<persistence> 
    <persistence-unit name="default" transaction-type="JTA"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <jta-data-source>jdbc/myDataSource</jta-data-source> 
     <properties> 
      <property name="openjpa.TransactionMode" value="managed" /> 
      <property name="openjpa.ConnectionFactoryMode" value="managed" /> 
      <property name="openjpa.jdbc.DBDictionary" value="db2" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

的applicationContext看起來像這樣

<beans> 
<context:annotation-config /> 
<bean id="myExceptionTranslator" class="org.springframework.orm.jpa.DefaultJpaDialect" /> 

<bean id="myEmf" class="javax.persistence.Persistence" factory-method="createEntityManagerFactory"> 
     <constructor-arg type="java.lang.String" value="default" /> 
</bean> 
    <jpa:repositories base-package="model.repositories" /> 
    <tx:annotation-driven transaction-manager="txManager" /> 
    <bean 
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
</beans> 

我OrderRepo界面看起來是這樣的:

@Transactional(readOnly = true) 
public interface OrderRepository extends JpaRepository<Order, Long> { 
//my stuff 
} 

,我用它就像我的服務班裏這樣

@Autowired 
private OrderRepository repository; 

但它看起來像的We​​bSphere不到風度喜歡它儘可能多的,給我這個錯誤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private model.repositories.OrderRepository model.service.OrderService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NoSuchMethodError: javax/persistence/EntityManager.getMetamodel()Ljavax/persistence/metamodel/Metamodel; 

我發現的唯一的ressource關於這個問題指出了先前的彈簧數據的JPA版本錯誤它們現在被標記爲已修復或錯誤使用了對spring-data-commons jar的錯誤依賴 - 但是:我將它留給maven,所以數據通用版本應該沒問題。我還發現春季數據JPA需要JPA 2.0實現,因此我檢查了websphere服務器上的openJPA版本,這很好。

任何想法可能導致這種情況?

回答

7

作爲錯誤INFORMS,存在javax.persistence.EntityManager沒有方法getMetaModel()。

檢查JPA 1.0和JPA 2.0的源代碼。

EntityManager JPA 2.0

EntityManager JPA 1.0

此方法只存在於版本2.0。在我看來,如果在版本1.0中沒有JPA jar,你應該仔細檢查你的依賴關係。

+1

你是絕對正確的。我在編譯目標中使用了版本爲1.0.2(最新版本?)的javax.persistence,因此我在編譯時沒有錯誤。我現在切換到openjpa 2.0持久化實現,並轉向「提供」的目標,因爲它無論如何都在websphere服務器上。 – masi

+0

依賴項:樹顯示使用JPA 1的依賴項。排除此解決了我的問題。感謝你的回答。 –

0

@Autowired的例子我發現似乎將它應用到Bean - 這是一個具體的類。您正在將其應用於界面 - 是否正確?

參見:tutorial

+0

是的,但這不應該是一個問題,檢查http://blog.springsource.org/2011/02/10/getting-started-with-spring-data-jpa/ – masi

1

我認爲你需要把下面的代碼放在dispatcher-servlet.xml文件中而不是applicationContext.xml文件中。

<tx:annotation-driven transaction-manager="txManager" /> 

我在幾天之前遇到過類似的問題,這個改變挽救了我的生命。 :)

希望你的也會被保存......乾杯。

+0

你可能有一個點。甚至認爲我的主要痛苦是由classpath造成的(看到正確的答案),現在我得到新的錯誤。主要是因爲websphere su ***。但是因爲我正在開發一個portlet,所以沒有經典servelet方式的「spring配置」。所以這不是我的解決方案。然而:我會upvote,以防其他人來看看這個。 – masi

相關問題