【问题标题】:Spring is unable to inject an EntityManager using @PersistenceContextSpring 无法使用 @PersistenceContext 注入 EntityManager
【发布时间】: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


【解决方案1】:

我认为您应该根据 Spring 官方文档仔细检查您的配置设置:https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#orm-jpa-setup-jndi。不,事务管理器由 Spring 提供。更多信息:https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#transaction-strategies

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 2017-05-19
    • 2012-04-24
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多