EntityManager注入 – NullPointerException

在我的Spring + JPA / Hibernate + Wicket应用程序中,我有一个QueryBuilder bean,我想在我的一个DAO中使用它,它在Criteria API的帮助下生成一个类型化查询:

@Service(value="inboxQueryBuilder") public class InboxQueryBuilder { @PersistenceContext EntityManager em; CriteriaBuilder cb; public InboxQueryBuilder() { cb = em.getCriteriaBuilder(); } public TypedQuery getQueryForApps(AppSearchObject aso) { ... } ... } 

但是,当我运行应用程序时,我得到一行空指针exception:

 cb = em.getCriteriaBuilder(); 

即EntityManager不会被注入。 你知道为什么吗?

此外,这是正确的和线程安全的,还是我应该为每个查询实例化我的InboxQueryBuilder? 在这种情况下,我是否应该注入EntityManager或者我应该将它作为构造函数参数传递(InboxQueryBuilder将为DAO中的每个查询实例化,其中有一个注入的EntityManager实例)?

您无法在构造函数中访问EntityManager。 看看@ PostConstruct-Annotation

 @Service(value="inboxQueryBuilder") public class InboxQueryBuilder { @PersistenceContext EntityManager em; CriteriaBuilder cb; public InboxQueryBuilder() { // em= null } @PostConstruct public void toSomething(){ // em set by Container cb = em.getCriteriaBuilder(); } public TypedQuery getQueryForApps(AppSearchObject aso) { ... } ... } 

编辑:再次阅读你的post后,我开始变得不确定,如果我是对的。 我知道JBoss中的Java EE-Dependency-Injection正如我所描述的那样工作,但我不确定spring-IOC。

你的应用程序上下文中有这个bean吗?

    

Spring使用Java Beans机制,所以我很确定这是不够的:

 @PersistenceContext EntityManager em; 

这是标准方式:

 private EntityManager entityManager; @PersistenceContext public void setEntityManager(final EntityManager entityManager){ this.entityManager = entityManager; }