【发布时间】:2017-05-28 21:38:54
【问题描述】:
我有一个在 Wildfly 10 服务器上运行的 Java 8/spring 4.3.5.RELEASE Web 应用程序。我使用persistence.xml 文件。我在 jboss jpa 和 hibernate 类上启用了跟踪日志记录,我可以看到该文件被拾取并顺利解析为持久性单元:
DEBUG [] [org.hibernate.jpa.internal.util.LogHelper] PersistenceUnitInfo [
name: testcontext
persistence provider classname: org.hibernate.jpa.HibernatePersistenceProvider
classloader: ModuleClassLoader for Module "deployment.BasicWebapp.war:main" from Service Module Loader
excludeUnlistedClasses: false
JTA datasource: org.jboss.as.connector.subsystems.datasources.WildFlyDataSource@fb80232
Non JTA datasource: null
Transaction type: JTA
PU root URL: vfs:/C:/Users/Me/Wildfly 10.0.0/standalone/deployments/BasicWebapp.war/WEB-INF/classes/
Shared Cache Mode: UNSPECIFIED
Validation Mode: AUTO
Jar files URLs []
Managed classes names [
com.company.project.data.User]
Mapping files names []
Properties [
jboss.entity.manager.jndi.name: persistence/testcontext]
我现在想要一个 dao 类有一个 spring 注入的实体管理器:
UserDao.class
@Repository
public class UserDao
{
@PersistenceContext(unitName = "testcontext")
private EntityManager entityManager;
}
我有组件扫描和注释配置,所以@Repository 和@PersistenceContext 注释都会在启动我的应用程序时得到处理:
spring-servlet.xml
<context:component-scan base-package="com.company.project" />
<context:annotation-config/>
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/testcontext"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>
<tx:annotation-driven/>
注入失败,有两种可能的方式:
如果我使用@PersistenceContext(unitName = "testcontext"),错误是:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'testcontext' available
如果我使用@PersistenceContext,错误是:
Caused by: java.lang.NullPointerException
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:580)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:546)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:707)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:680)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354)
... 44 more
所以我在这个配置中遗漏了一些东西来告诉处理 @PersistenceContext 注释的 Spring 部分查看我在 spring-servlet.xml 中声明的 entityManagerFactory bean,或者直接使用容器的持久性单元.我需要添加什么来实现这一点?
我对事务管理器部分也有些粗略。 Wildfly 是否提供事务管理器?如果是这样,我是否需要在 Spring 中为它创建一个 bean(它会选择 jboss 创建的还是自己创建的?)
【问题讨论】:
-
jndi-name="persistence/**testcontext**" 但@PersistenceContext(unitName = "textcontext")。可能只是那里使用了错误的名称
-
对不起,只是问题中的一个错字。如果你查看 UserDao 类 sn-p 你会发现它一直是 testcontext
-
能否包含您的 persistence.xml 文件?
标签: java spring hibernate jpa wildfly