2012-04-19 14 views
1

TomcatのCDIに問題があります。それは私のコードのいくつかの関連する部分です:Genericsクラスで注入するとCDIが動作しない - Java

public class JPAUtil { 
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit"); 

    @Produces @RequestScoped 
    public static EntityManager getEntityManager() { 
     return emf.createEntityManager(); 
    } 


    public void close(@Disposes EntityManager em) { 
     em.close(); 
    } 

} 

マイDAOクラス:

public class DAO<T> implements Serializable{ 

    private final Class<T> classe; 

    @Inject 
    protected EntityManager em; 

    public DAO(Class<T> classe) { 
     this.classe = classe; 
    } 
} 

と子クラス:

public class UserDao extends DAO<User> implements Serializable{ 

    public UserDao() { 
     super(User.class); 
    } 
} 

ためのジェネリック医薬品のため、私はDAOのためにプロデューサーを使用しましたクラス:この中

public class DAOFactory { 

    @Produces 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public DAO createDAO(InjectionPoint injectionPoint) { 
     ParameterizedType type = (ParameterizedType) injectionPoint.getType(); 
     Class classe = (Class) type.getActualTypeArguments()[0]; 
     return new DAO(classe); 
    } 
} 

例:

public class Test { 
    @Inject UserDAO userDAO; 
    @Inject DAO<User> dao; 
} 

UserDAOクラスを使用しようとすると、すべて正常に動作しますが、DAOを使用すると、EntityManagerはnullのままです。誰もが考えている?

答えて

5

DAOFactoryでは、new演算子を使用してDAOをインスタンス化します。そうした場合、CDIはDAOインスタンスに依存関係を注入する機会がありません。 UserDAOにある間、CDIはエンティティマネージャインジェクションを管理します。 DAOFactoryでは、新しく作成されたDAOインスタンスでエンティティマネージャを手動で設定する必要があります。

+1

OK、EntityManagerを工場に渡し、DAOで設定します。このように、それは動作します、ありがとう! – Montolide

+1

@Montolide:修正したコードを質問の最後の「解決策」セクションに公開できますか? – Francois

関連する問題