开发者

EntityManager injection - NullPointerException

In my Spring+JPA/Hibern开发者_如何学Goate+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)?


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.


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>


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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜