【问题标题】:Transaction Exception with Spring 4.0.6 + Weblogic 10.3.6 + EJB 3.0 CMT + Spring Data JPA 1.6.2 - "Error binding to externally managed transaction"Spring 4.0.6 + Weblogic 10.3.6 + EJB 3.0 CMT + Spring Data JPA 1.6.2 的事务异常 - “错误绑定到外部管理的事务”
【发布时间】:2014-09-05 09:18:30
【问题描述】:

我在使用 Weblogic 10.3.6、Spring 4.0.6、Spring Data JPA 1.6.2、Eclipselink(复制了 Weblogic 嵌入式 2.3 版本和最新的 2.5.2 版本)时遇到了一个奇怪且难以调试的问题,并且容器管理事务。 (我更新了 Weblogic 以使用 JPA 2.0 安装 Oracle 提供的补丁)。

问题如下:我有一个简单的、无状态的 EJB 3.0,我在其中使用 Spring Autowiring 和 spring-data-jpa 存储库。

当我调用 EJB 公开的任何服务时,我得到以下奇怪的异常(请注意,我必须查找/替换所有真实的类名/路径):

EJB Exception: : com.oracle.pitchfork.interfaces.LifecycleCallbackException: Failure to invoke public void org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.autowireBean(javax.interceptor.InvocationContext) on bean class class 
    ... 58 more
Caused by: org.springframework.beans.factory.access.BootstrapException: Unable to initialize group definition. Group resource name [classpath*:beanRefContext.xml], factory key [null]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainApplicationContext' defined in URL [file:/C:/work/project/spring-ejb-project/target/classes/beanRefContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.context.support.ClassPathXmlApplicationContext]: Constructor threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actionTBConverter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.dao.repositories.personRepository myproject.converters.DataConverter.personRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.factory.access.SingletonBeanFactoryLocator.useBeanFactory(SingletonBeanFactoryLocator.java:387) 
    at org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.getBeanFactoryReference(SpringBeanAutowiringInterceptor.java:160)
    at org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.getBeanFactory(SpringBeanAutowiringInterceptor.java:141)
    at org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.doAutowireBean(SpringBeanAutowiringInterceptor.java:121)
    at org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.autowireBean(SpringBeanAutowiringInterceptor.java:95)
    ... 63 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainApplicationContext' defined in URL [file:/C:/work/project/spring-ejb-project/target/classes/beanRefContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.context.support.ClassPathXmlApplicationContext]: Constructor threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actionTBConverter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.dao.repositories.personRepository myproject.converters.DataConverter.personRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:278)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.context.access.ContextSingletonBeanFactoryLocator.initializeDefinition(ContextSingletonBeanFactoryLocator.java:143)
    at org.springframework.beans.factory.access.SingletonBeanFactoryLocator.useBeanFactory(SingletonBeanFactoryLocator.java:382)
    ... 67 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.context.support.ClassPathXmlApplicationContext]: Constructor threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actionTBConverter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.dao.repositories.personRepository myproject.converters.DataConverter.personRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:125)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:270)
    ... 80 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actionTBConverter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.dao.repositories.personRepository myproject.converters.DataConverter.personRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 82 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private myproject.dao.repositories.personRepository myproject.converters.DataConverter.personRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 99 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 101 more
Caused by: javax.persistence.PersistenceException:
Exception Description: Error binding to externally managed transaction
Internal Exception: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.registerIfRequired(JTATransactionWrapper.java:145)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.setJTATransactionWrapper(EntityManagerImpl.java:2153)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.detectTransactionWrapper(EntityManagerImpl.java:878)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.initialize(EntityManagerImpl.java:401)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.<init>(EntityManagerImpl.java:394)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:321)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
    at sun.reflect.GeneratedMethodAccessor257.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at weblogic.deployment.EntityManagerFactoryProxyImpl.invoke(EntityManagerFactoryProxyImpl.java:96)
    at com.sun.proxy.$Proxy59.createEntityManager(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
    at com.sun.proxy.$Proxy160.createNamedQuery(Unknown Source)
    at org.springframework.data.jpa.repository.query.NamedQuery.<init>(NamedQuery.java:62)
    at org.springframework.data.jpa.repository.query.NamedQuery.lookupFrom(NamedQuery.java:113)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:132)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:166)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:69)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:320)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:169)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:224)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:210)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
    ... 111 more
Caused by: weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at weblogic.transaction.internal.TransactionImpl.throwRollbackException(TransactionImpl.java:1884)
    at weblogic.transaction.internal.ServerTransactionImpl.registerSynchronization(ServerTransactionImpl.java:639)
    at org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.registerIfRequired(JTATransactionWrapper.java:136)
    ... 137 more
Caused by: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction
    at weblogic.transaction.internal.TransactionImpl.setRollbackOnly(TransactionImpl.java:555)
    at weblogic.transaction.internal.TransactionManagerImpl.setRollbackOnly(TransactionManagerImpl.java:340)
    at weblogic.transaction.internal.TransactionManagerImpl.setRollbackOnly(TransactionManagerImpl.java:333)
    at org.eclipse.persistence.transaction.JTATransactionController.markTransactionForRollback_impl(JTATransactionController.java:160)
    at org.eclipse.persistence.transaction.AbstractTransactionController.markTransactionForRollback(AbstractTransactionController.java:216)
    at org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.setRollbackOnlyInternal(JTATransactionWrapper.java:85)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.setRollbackOnly(EntityManagerImpl.java:2092)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1127)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:289)
    ... 124 more
; nested exception is: com.oracle.pitchfork.interfaces.LifecycleCallbackException: Failure to invoke public void org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.autowireBean(javax.interceptor.InvocationContext) on bean class class org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor_s85z0p_Impl with args: [com.oracle.pitchfork.intercept.InterceptionMetadata$LifecycleEventCallbackInvocationContext@cb3ef49]

我真的很难理解为什么会发生这种情况,我希望有人能抽出时间来帮助我。

这里跟随我的代码细节

(我去掉了 xml 命名空间来保存字符,并删除了真实的项目类名)

这是我的 beanRefContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...">

    <bean id="mainApplicationContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>classpath*:/spring-config.xml</value>
            </list>
        </constructor-arg>
    </bean>


</beans>

这是我的 spring-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans ...
        default-lazy-init="false">

    <context:annotation-config/>
    <context:component-scan base-package="myproject"/>

</beans>

这是我的 Spring Config java 文件:

@Configuration
@EnableLoadTimeWeaving
@EnableJpaRepositories("myproject.dao.repositories")
public class SpringConfig implements ApplicationContextAware, LoadTimeWeavingConfigurer {

    private static final Logger LOG = LoggerFactory.getLogger(SpringConfig.class);

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext ac) {
        this.applicationContext = ac;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() throws Exception {
        Context ctx = new InitialContext();
        return (EntityManagerFactory) ctx.lookup("java:/comp/env/MyPersistenceUnitJNDI");
    }

    @Bean
    public TransactionManager transactionManager() throws Exception {
        InitialContext initCtx = new InitialContext();
        TransactionManager tm = (TransactionManager) initCtx.lookup("weblogic.transaction.TransactionManager");
        WebLogicJtaTransactionManager wlTx = new WebLogicJtaTransactionManager();
        wlTx.setTransactionManager(tm);
        return (TransactionManager) wlTx;
    }


    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        EclipseLinkJpaVendorAdapter va = new EclipseLinkJpaVendorAdapter();
        va.setDatabase(Database.ORACLE);
        return va;
    }

    @Override
    public LoadTimeWeaver getLoadTimeWeaver() {
        LoadTimeWeaver ltw = new WebLogicLoadTimeWeaver();
        return ltw;
    }


}

Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="MyPersistenceUnit" transaction-type="JTA">

        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <jta-data-source>db/myprojectdatasource</jta-data-source>

        <class>myproject.dao.entities.Person</class>

        <properties>
          <property name="eclipselink.target-server" value="WebLogic_10"/>
          <property name="eclipselink.logging.level" value="FINEST"/>
        </properties>
    </persistence-unit>
</persistence>

我的 EJB 类:

@Stateless(name="TestEJB", mappedName="ejb/MyProject/TestEJB")
@WebService
@Interceptors({SpringBeanAutowiringInterceptor.class})
@PersistenceUnit(name="MyPersistenceUnitJNDI", unitName="MyPersistenceUnit")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestEJB implements TestEJBRemote, TestEJBLocal {

    private static final Logger LOG = LoggerFactory.getLogger(TestEJB.class);

    @Autowired
    private ApplicationContext appContext;

    @Autowired
    private PersonRepository personRepo;


    public TestEJB() {
    }

    @WebMethod
    public String findPerson(String name) {
        return ""+ personRepo.findByName(name);
    }

    @WebMethod
    public String findAllPerson() {
        return ""+ personRepo.findAll();
    }


}

Person 实体类(简单地通过 Eclipse 自动生成):

@Entity
@Table(name="PERSON")
public class Person implements Serializable {
    private static final Long serialVersionUID = 1L;

    @Id
    @Column(name="ID")
    private Long id;

    private String name;


    public Person() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

...

}

PersonRepository 类:

@Eager
public interface PersonRepository extends JpaRepository<Person, Long> {

    List<Person> findByName(String name);

}

DataConverter 类:

@Service
public final class DataConverter implements Converter<Person, PersonDTO> {


    @Autowired
    private PersonRepository personRepository;


    public DataConverter() {
    }

    @Override
    public PersonDTO convert(Person p) {

    ...

    }
}

更新: 更好地跟踪堆栈跟踪,尤其是这部分:

 at weblogic.deployment.EntityManagerFactoryProxyImpl.invoke(EntityManagerFactoryProxyImpl.java:96)
    at com.sun.proxy.$Proxy59.createEntityManager(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
    at com.sun.proxy.$Proxy160.createNamedQuery(Unknown Source)
    at org.springframework.data.jpa.repository.query.NamedQuery.<init>(NamedQuery.java:62)
    at org.springframework.data.jpa.repository.query.NamedQuery.lookupFrom(NamedQuery.java:113)

如果 Stateless bean 创建是通过调用 Transactional 方法触发的,Spring 似乎无法初始化 JPA 存储库!!!

确实,如果我执行以下操作: 1.在ejb上调用一个非事务方法(@TransactionAttributeType.NEVER):这个调用成功 2. 现在我确实调用了 personRepository.findByName:它有效!

所以问题似乎是 Spring JPA 存储库在进行 CMT 事务时无法注册其命名查询。

这听起来对某人来说很熟悉吗?也许有一种方法可以避免在事务上下文中初始化这些存储库? (我尝试了@Eager 注解,但在这种情况下没有改变任何东西)。

附言另一点信息:切换到 Hibernate 3.6.10.Final 作为 JPA Provider 是解决此问题的方法。我在这方面工作得越多,我就越相信 Spring Data JPA 和 Eclipselink 之间可能存在错误(我都尝试过 Eclipselink 2.3(嵌入在 Weblogic 中)和 2.5.2)。

【问题讨论】:

  • 这是一个巨大的堆栈跟踪。我会专注于:Error creating bean with name 'mainApplicationContext': Could not instantiate bean class : Injection of autowired dependencies failed Could not autowire field: 并查看类似的问题,例如 stackoverflow.com/questions/11954461/…
  • 您好,感谢您抽出时间回答我。事实上,我正在关注堆栈跟踪的这一部分:org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283) at com.sun.proxy.$Proxy160.createNamedQuery(Unknown Source) at org.springframework.data.jpa.repository.query.NamedQuery.&lt;init&gt;(NamedQuery.java:62) 如果在事务方法中触发初始化/接线,Spring 似乎无法初始化 JPA 存储库!!!
  • 我遇到的问题与这个错误非常相似:jira.spring.io/browse/DATAJPA-442

标签: spring weblogic eclipselink ejb-3.0 spring-transactions


【解决方案1】:

我想添加我发现的这个解决方法:切换到 Hibernate 3.6.10.Final 作为 JPA Provider 解决了这个问题。

这个开关只需要改变persistece.xml文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="MyPersistenceUnit" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>db/myprojectdatasource</jta-data-source>

        <class>myproject.dao.entities.Person</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.WeblogicTransactionManagerLookup" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

在 Spring 中,您仍然可以从 JNDI 上下文中查找 EntityManagerFactoryJtaTransactionManager

请注意,我明确省略了设置 JtaFactoryClass

&lt;property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" /&gt;

休眠属性:如果我这样做了,出于某些原因,Weblogic 事务管理器会在执行事务之前禁用自动提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2018-02-04
    • 2013-06-21
    • 2015-06-18
    相关资源
    最近更新 更多