【问题标题】:NullPointerException for EntityManager using @PersistenceContext使用 @PersistenceContext 的 EntityManager 的 NullPointerException
【发布时间】:2016-09-04 11:45:10
【问题描述】:

我正在尝试创建一个具有EntityManager 的审计服务。但是,当我运行应用程序时,这个EntityManager 从未初始化,所以在调用它时,它会抛出一个NullPointerException

我的代码如下所示:

import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Service
public class AuditServiceImpl implements AuditService {

    private static final String FULL_NAME = "%s %s";

    @PersistenceContext
    private EntityManager entityManager;

    public EntityManager getEntityManager(){
        return entityManager;
    }
}

我希望@PersistenceContext 注释会为我解决这个问题,但它没有。我看到其他几个关于类似问题的帖子,但大多数解决方案似乎已经过时,所以我决定创建另一个帖子。

任何人都可以阐明这个问题,甚至是解决方案吗?

【问题讨论】:

  • 您是如何创建AuditServiceImpl 实例的?
  • 我使用默认构造函数。
  • 你如何期望 Spring 将依赖项注入到它不知道的 bean 实例中?如果您自己创建实例,则不会注入任何依赖项。
  • 如果我让 Spring 通过使用注释 @PersistenceContext 或 @PersistenceUnit 创建它(此时我迷失在这些注释中)它仍然会给出 NullPointerException..
  • 那你配置错了。首先不要自己创建实例,使用依赖注入。如果您需要 AuditService 注入它,请不要创建它。如果使用 XML,请确保您有 <context:component-scan /> 或(使用 java 配置时为 @ComponentScan)。如果你有这些并且你也让 Spring 管理你的实体管理器,它将被注入。如果不是,你真的错过了一些东西。我强烈建议阅读参考指南,了解如何注入 EntityManagerEntityManagerFactory 以及两者之间的区别。

标签: java spring hibernate hibernate-entitymanager


【解决方案1】:

首先,请确保 EntityManagerFactory 和持久化单元设置正确。一个简单的 XML 样式如下:

<context:component-scan base-package="..." />
<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="yourPersistenceUnit" />
</bean>

但是从您下面的评论来看,问题似乎是 AuditServiceImpl 的引用方式可能是原因。基本上,使用 AuditService 的客户端应该从 Spring IoC 容器中获取引用,而不是实例化对象本身。它可以通过多种方式完成,例如在独立应用程序中通过 XML 样式实例化容器时使用 ApplicationContext:

ApplicationContext context =
        new ClassPathXmlApplicationContext(new String[] {"yourApplicationContext.xml"});
AuditService auditService = context.getBean("auditService", AuditService.class);
auditService.doSomething();

如果您使用的是 Spring MVC,或者将服务注入到 Web 层的客户端。

@Controller
public class MyController {
    @Autowired
    AuditService auditService;

    public void foo() {
        auditService.doSomething();
    }
}

【讨论】:

    【解决方案2】:

    不是注入EntityManager,而是在代码中注入EntityManagerFactory

    请看下面:

    @PersistenceUnit(unitName = "persistanceUnitName") private EntityManagerFactory entityManagerFactory;

    然后要获取EntityManager,请执行以下代码:

    public EntityManager getEntityManager(){ return entityManagerFactory.createEntityManager(); }

    【讨论】:

    • 谢谢,但它仍然为返回 entityManagerFactory.createEntityManager(); 给出 NullPointerException;
    • 请检查persistance.xml文件中是否正确指定了persistanceUnitName。
    • 我不使用persistence.xml文件,因为我使用了注解。
    • 在像 MyController 这样的控制器类中,我不建议注入 EntityManagerFactory。
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2017-03-20
    • 2020-06-22
    • 2023-03-23
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多