2010-11-09 34 views
3

Dans mon printemps + app JPA/Hibernate + Wicket, j'ai un grain de QueryBuilder que je veux utiliser dans un de mes OTI qui génère une requête typée avec l'aide de l'API Critères:injection EntityManager - NullPointerException

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

    @PersistenceContext 
    EntityManager em; 

    CriteriaBuilder cb; 

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

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

    ... 
} 

Cependant, quand je lance l'application, je reçois une exception de pointeur nul pour la ligne:

cb = em.getCriteriaBuilder(); 

-à-dire la EntityManager ne se laisse pas injecté. Est-ce que tu sais pourquoi?

De même, cette utilisation est-elle correcte et thread-safe ou devrais-je instancier mon InboxQueryBuilder pour chaque requête? Dans ce cas, devrais-je également injecter l'EntityManager ou devrais-je simplement le passer comme un paramètre constructeur (InboxQueryBuilder serait instancié pour chaque requête dans le DAO qui a une instance injectée d'EntityManager)?

+0

Comment créez-vous InboxQueryBuilder? – willcodejavaforfood

+0

dans l'exemple donné, c'est un haricot de printemps. mais je ne sais pas si en faire un singleton est bon. –

+0

N'utilisez pas de singletons dans un projet de ressorts. Utilisez plutôt des haricots singleton printaniers. –

Répondre

10

Vous ne pouvez pas accéder au EntityManager dans les le constructeur. Jetez un oeil à l'@ 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: Après avoir lu votre message à nouveau, je commence à est devenu incertain, si je ne me trompe pas. Je sais que Java EE-Dependency-Injection dans un JBoss fonctionne comme je l'ai décrit, mais je ne suis pas sûr de spring-IOC.

+0

Oui c'est ça. Maintenant tout fonctionne comme un charme. –

+0

C'est ici que le printemps est votre ami! Il fait le contrôle automatique du gestionnaire d'entité pour vous - sans ressort cela ne fonctionnerait pas - l'injection automatique de l'Entity Manager ne fonctionne (via le serveur d'applications) que si vous courez à l'intérieur d'un EJB. –

0

Avez-vous ce bean quelque part dans votre contexte d'application?

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

oui je fais. entitymanager est injecté dans le DAO qui appelle la méthode getQueryForApps sans problème. –

+0

puis le commentaire de seanizer est la réponse. Vous devriez faire ressort singleton – nanda

0

Spring utilise Java mécanisme de haricots, donc je suis assez sûr que cela ne suffit pas:

@PersistenceContext 
EntityManager em; 

est ici la manière standard:

private EntityManager entityManager; 

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

cela fonctionne bien dans mes autres DAO –

+0

OK, avez-vous autowiring activé? –