2010-11-09 72 views
3

在我的春节+ JPA /休眠+检票程序,我有一个QueryBuilder的豆,我想在我的DAO中的一个产生与标准API的帮助下,键入的查询使用方法:EntityManager的注入 - NullPointerException异常

@Service(value="inboxQueryBuilder") 
public class InboxQueryBuilder { 

    @PersistenceContext 
    EntityManager em; 

    CriteriaBuilder cb; 

    public InboxQueryBuilder() { 
     cb = em.getCriteriaBuilder(); 
    } 

    public TypedQuery<App> getQueryForApps(AppSearchObject aso) { 
      ... 
    } 

    ... 
} 

然而,当我运行应用程序,我得到一个空指针异常线路:

cb = em.getCriteriaBuilder(); 

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

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

+0

如何创建InboxQueryBuilder?在给出的例子中为 – willcodejavaforfood 2010-11-09 10:10:35

+0

,它是一个春天的豆子。但我不知道如果把它变成单身人士是好的。 – 2010-11-09 10:14:08

+0

不要在弹簧项目中使用单身人士。改用spring singleton bean。 – 2010-11-09 10:32:25

回答

10

中你不能访问的EntityManager构造函数。看看在@ PostConstruct - 译注

@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<App> getQueryForApps(AppSearchObject aso) { 
     ... 
} 

... 
} 

编辑: 再次阅读你的文章后,我开始变得不确定,如果我是对的。我知道JBoss中的Java EE依赖注入工作正如我所描述的那样,但我不确定Spring-IOC。

+0

是的,这是它。现在一切都像一个魅力。 – 2010-11-09 13:17:07

+0

这就是春天是你的朋友!它正在为您实现实体管理器的自动化 - 如果没有弹簧,这将无法工作 - 如果您在EJB内部运行,实体管理器的自动注入只能工作(通过应用程序服务器)。 – 2010-11-09 14:09:33

0

你在你的应用程序上下文中的某处有这个bean?

​​
+0

是的,我愿意。 entitymanager被注入到调用getQueryForApps方法而没有问题的DAO中。 – 2010-11-09 10:29:34

+0

那么来自seanizer的评论就是答案。你应该让它春天singleton – nanda 2010-11-09 10:35:46

0

Spring使用Java组件的机制,所以我敢肯定这是不够的:

@PersistenceContext 
EntityManager em; 

这里的标准方式:

private EntityManager entityManager; 

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

它在我的其他DAO的 – 2010-11-09 10:32:34

+0

工作正常好,你有自动装置打开? – 2010-11-09 10:34:46