使用注入的Spring Data JPA返回“NoSuchMethodError”

时间:2012-05-07 21:21:36

标签: spring websphere spring-data spring-data-jpa

我正在使用Spring-Data-JPA 1.0.3.RELEASE来管理我的ORM。

我的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;

但看起来像websphere不喜欢它并给我这个错误:

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;

我发现有关此问题的唯一资源指出以前的Spring-Data-JPA版本中的错误,这些错误现在被标记为已修复或错误使用错误的依赖关系到spring-data-commons jar - 但是:我要离开为了maven所以data-commons版本应该没问题。另外我发现spring数据JPA需要JPA 2.0实现,所以我在websphere服务器上检查了openJPA版本,没关系。

任何可能导致此问题的想法?

3 个答案:

答案 0 :(得分:7)

当错误通知时,javax.persistence.EntityManager中没有方法getMetaModel()。

检查JPA 1.0和JPA 2.0的来源。

EntityManager JPA 2.0

EntityManager JPA 1.0

此方法仅在2.0版中存在。在我看来,如果版本1.0中没有jar的JPA,你应该仔细检查你的依赖项

答案 1 :(得分:1)

我认为您需要将以下行放在dispatcher-servlet.xml文件中而不是applicationContext.xml文件中。

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

我在几天之前遇到过类似的问题,这种改变挽救了我的生命。 :)

希望你们也能得救......干杯。

答案 2 :(得分:0)

@Autowired我发现的例子似乎将它应用于Bean - 这是一个具体的类。您正在将它应用于界面 - 这是正确的吗?

请参阅:tutorial