将 Spring Data JPA 与 EJB/CDI 结合使用时,对存储库的初始请求出现奇怪的异常

2024-04-21

我创建了一个小项目,其中结合了 Spring Data、JPA 存储库、EJB/CDI 以及 Wildfly Swarm 或普通 Wildfly。

The 休息资源 https://github.com/maxant/swarm-problems/blob/problem/spring-data-initial-request/src/main/java/ch/maxant/demo/swarmproblems/EmployeeResource.java(EJB)调用CDI bean https://github.com/maxant/swarm-problems/blob/problem/spring-data-initial-request/src/main/java/ch/maxant/demo/swarmproblems/EmployeeService.java其中有一个Spring Data JPA 存储库 https://github.com/maxant/swarm-problems/blob/problem/spring-data-initial-request/src/main/java/ch/maxant/demo/swarmproblems/EmployeeRepository.java注射。

对存储库的初始请求以异常结束,但后续调用工作正常。

2016-12-15 23:03:09,690 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-1) SQL Error: 0, SQLState: null
2016-12-15 23:03:09,690 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-1) javax.resource.ResourceException: IJ000460: Error checking for a transaction
2016-12-15 23:03:10,268 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /Penny: org.jboss.resteasy.spi.UnhandledException: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
...
Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
...
Caused by: java.lang.Throwable: setRollbackOnly called from:
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.setRollbackOnly(TransactionImple.java:339)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.setRollbackOnly(BaseTransaction.java:159)
    at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.setRollbackOnly(BaseTransactionManagerDelegate.java:143)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.markForRollbackOnly(AbstractEntityManagerImpl.java:1509)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1611)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.buildQueryFromName(AbstractEntityManagerImpl.java:753)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:730)
    at org.springframework.data.jpa.repository.query.NamedQuery.hasNamedQuery(NamedQuery.java:99)
    at org.springframework.data.jpa.repository.query.NamedQuery.lookupFrom(NamedQuery.java:121)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:212)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:77)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:435)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:220)
    at org.springframework.data.jpa.repository.cdi.JpaRepositoryBean.create(JpaRepositoryBean.java:73)
    at org.springframework.data.repository.cdi.CdiRepositoryBean.create(CdiRepositoryBean.java:372)
    at org.springframework.data.repository.cdi.CdiRepositoryBean.create(CdiRepositoryBean.java:170)
    at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96)
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101)
    at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:99)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99)
    at ch.maxant.demo.swarmproblems.EmployeeService.findByName(EmployeeService.java)
    at ch.maxant.demo.swarmproblems.EmployeeService$Proxy$_$$_WeldClientProxy.findByName(Unknown Source)
    at ch.maxant.demo.swarmproblems.EmployeeResource.get(EmployeeResource.java)

经过调试,我发现org.springframework.data.jpa.respository.query.NamedQuery#lookupFrom最终打电话 通过到org.hibernate.jpa.spi.AbstractentityManagerImpl#buildQueryfromName这似乎引发了IllegalArgumentException: No query defined for that name [Employee.findByName]。这是有道理的,因为 Spring 似乎正在延迟加载命名查询。

这是 Spring 中的错误还是应用程序设置不正确?

使用 JBoss Wildfly (8) 的另一个项目也有同样的问题:https://github.com/maxant/jee7webappwithspringdata https://github.com/maxant/jee7webappwithspringdata.


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Spring Data JPA 与 EJB/CDI 结合使用时,对存储库的初始请求出现奇怪的异常 的相关文章

随机推荐