EntityManager injection - NullPointerException

只谈情不闲聊 提交于 2019-12-04 14:05:58

问题


In my Spring+JPA/Hibernate+Wicket app, I have a QueryBuilder bean that I want to use in one of my DAOs which generates a typed query with the help of Criteria API:

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

    @PersistenceContext
    EntityManager em;

    CriteriaBuilder cb;

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

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

    ...
}

However, when I run the app, I get a null pointer exception for line:

cb = em.getCriteriaBuilder();

i.e. the EntityManager doesn't get injected. Do you know why?

Also, is this use correct and thread-safe or should I instantiate my InboxQueryBuilder for each query? In that case, should I also inject the EntityManager or should I just pass it as a constructor parameter (the InboxQueryBuilder would get instantiated for each query in the DAO which has an injected instance of EntityManager)?


回答1:


You can't access the EntityManager within the constructor. Take a look at the @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<App> getQueryForApps(AppSearchObject aso) {
       ...
}

...
}

EDIT: After reading your post again, I start to became unsure, if I'm right. I know the Java EE-Dependency-Injection within a JBoss works as I described, but I'm not sure about spring-IOC.




回答2:


Do you have this bean somewhere in your application context?

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="myPersistenceUnit"/>
</bean>



回答3:


Spring uses the Java Beans mechanism, so I am pretty sure this is insufficient:

@PersistenceContext
EntityManager em;

Here's the standard way:

private EntityManager entityManager;

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


来源:https://stackoverflow.com/questions/4132437/entitymanager-injection-nullpointerexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!