2012-02-09 4 views
2

コンテナ管理のトランザクションを1つのクラスで使用し、そのサブクラスと共有したいと考えています。ここでJBoss - EntityManagerのインジェクトに失敗しました

私の抽象クラスです:

@TransactionManagement(TransactionManagementType.CONTAINER) 
public abstract class AbstractDAO { 
    @PersistenceContext(unitName = "myDS") 
    protected EntityManager em; 

    @Resource 
    protected SessionContext context; 

    protected Logger log; 

    public AbstractDAO() { 
     log = LoggerFactory.getLogger(this.getClass()); 
    } 
} 

その子の一つ:この子の上に

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class OrdreDAO extends AbstractDAO { 
    public OrdreDAO() { 

    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void persist(Ordre o) { 
     em.persist(o);// NPE here ... no EntityManager injected ! 
    } 

    @SuppressWarnings("unchecked") 
    public List<Ordre> findAll() { 
     Query q = em.createQuery("from Ordre"); 
     return q.getResultList(); 
    } 
} 

、OrdreService:

public class OrdreService { 
    private OrdreDAO dao; 

    public OrdreService() { 
       dao=new OrdreDAO(); 
    } 

    public void persist(Ordre o) { 
     System.out.println("Service::persist ??"); 
     dao.persist(o); 
    } 

    public List<Ordre> getOrdres() { 
     return dao.findAll(); 
    } 

    public Ordre getOrdre(String id) { 
     return dao.findByPK(id); 
    } 

    public Ordre merge(Ordre o) { 
     return dao.merge(o); 
    } 
} 

それを使用してサーブレット:

私は永続化しようとするとNPEを取得しますOrdre 何が欠けていますか?

JDK 6
のJBoss 5.1.0.GA
JPA 1

+1

@Stateelessに抽象クラスを与える理由は何ですか?そこから削除してテストすることができます –

+0

あなたのコードがうまくいかない理由がわかりません。 NetBeansは、EntityManagerがサブクラスにインジェクトされている点だけで、まったく同じようにサービスファサードクラスを生成するということが分かります。それは動作します(少なくともGlassFish 3では)。 http://netbeans.dzone.com/nb-generate-simpler-rest – perissf

+0

自分の投稿を私のコードで更新しました – Stephan

答えて

2

あなたOrdreServicePOJOクラスは、Webコンテナによって管理されていない、ともそれはだと私には思えます無駄な追加層。私はOrdreDAOだけを使用します。

いずれにしても、両方のクラスを維持する場合は、OrdreServiceStatelessEJBとします。使用OrdreServiceOrdreDAOインスタンスを注入:

@EJB private OrdreDAO dao; 

最後に、使用してサーブレットにOrdreServiceを注入:

@EJB private OrdreService os; 

これは動作するはずです。

関連する問題