Внедрение EntityManager - NullPointerException - PullRequest
3 голосов
/ 09 ноября 2010

В моем приложении Spring + JPA / Hibernate + Wicket у меня есть bean-компонент QueryBuilder, который я хочу использовать в одном из моих DAO, который генерирует типизированный запрос с помощью API Criteria:

@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)?

Ответы [ 3 ]

10 голосов
/ 09 ноября 2010

Вы не можете получить доступ к 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<App> getQueryForApps(AppSearchObject aso) {
       ...
}

...
}

РЕДАКТИРОВАТЬ: После прочтения вашего поста я начинаю сомневаться, если я прав.Я знаю, что Java EE-Dependency-Injection в JBoss работает, как я описал, но я не уверен насчет spring-IOC.

0 голосов
/ 09 ноября 2010

Spring использует механизм Java Beans, поэтому я уверен, что этого недостаточно:

@PersistenceContext
EntityManager em;

Вот стандартный способ:

private EntityManager entityManager;

@PersistenceContext
public void setEntityManager(final EntityManager entityManager){
    this.entityManager = entityManager;
}
0 голосов
/ 09 ноября 2010

Есть ли у вас этот компонент где-то в контексте вашего приложения?

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