2012-05-07 8 views
4

私は自分のORMを管理するためにSpring-Data-JPA 1.0.3.RELEASEを使用しています。SpringデータJPAを使用して注入 "NoSuchMethodError"を返す

私のpersistence.xmlは次のようになります。

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

と私はそれを使用しています:

<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のが私のOrderRepoインターフェイスは次のようになります。この

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

のように見えますこのように私のサービスクラス内

@Autowired 
private OrderRepository repository; 

しかし、それは、WebSphereが同じくらいそれのようにdosn'tのように見えると私は、このエラーを与える:

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

、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

applicationContext.xmlファイルではなく、dispatcher-servlet.xmlファイルに次の行を入れる必要があります。

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

私は数日前に同様の問題に直面していました。 :)

希望も保存されます...乾杯。

+0

そこにポイントがあるかもしれません。私の主な痛みはクラスパス地獄(正解を見てください)によって引き起こされたと思っていましたが、今では新しいエラーが発生しています。主にwebsphere su ***のためです。しかし、私はポートレットを開発しているので、古典的なサーブレットの方法では "春の設定"がありません。それは私のための解決策ではありません。しかし、私はupvoteときに他の人が来て、これを参照してください。 – masi

関連する問題