EntityManager injection - NullPointerException

Dans mon Printemps+JPA/Hibernate+Portillon application, j'ai un QueryBuilder de haricot que je veux l'utiliser dans un de mes DAOs qui génère un tapé la requête avec l'aide de l'API criteria:

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

    @PersistenceContext
    EntityManager em;

    CriteriaBuilder cb;

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

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

    ...
}

Cependant, lorsque je lance l'application, j'obtiens une exception de pointeur null pour la ligne:

cb = em.getCriteriaBuilder();

c'est à dire l'EntityManager à ne pas avoir injecté. Savez-vous pourquoi?

Aussi, est-ce correct d'utilisation et thread-safe ou devrais-je instancier mon InboxQueryBuilder pour chaque requête? Dans ce cas, dois-je aussi injecter de l'EntityManager ou devrais-je passer en tant que paramètre du constructeur (le InboxQueryBuilder serait d'obtenir instancié pour chaque requête dans le DAO qui a l'injection d'une instance de l'EntityManager)?

Comment voulez-vous créer InboxQueryBuilder?
dans l'exemple donné, c'est un printemps bean. mais je ne sais pas si faire un singleton est bon.
N'utilisez pas des singletons dans un projet pour le printemps. Utiliser le printemps singleton haricots à la place.

OriginalL'auteur John Manak | 2010-11-09