EJBコンテナによって管理されるentityManagerの使用に問題があります。Persistence ContextからのEntityManagerのヌルポインタ例外Java EE
-domain - エンティティ・クラスおよびDAO実装は、EJBなどのインタフェースであります。私の耳には
iは、3つのモジュールがあります。-services - ライブラリの例外(データベース例外など)に基づいてビジネス例外を呼び出し、リクエストの処理に関連するロジックがあります。
-Rest Services - 私はいくつかのビジネスオブジェクトを送受信するために休憩のエンドポイントを持っていました。
主な問題は、サービス層でEJBを使用することです。残りのエンドポイントクラス、サービスクラス、およびDAOクラスをEJBとして宣言できます。しかし、その方法では、データベースに関連する例外をキャッチすることはできません。なぜなら、私がredFlashで提供されたEJBコンテナでtransactionRollback例外を取得し、この例外がコミットトランザクションに存在するからです。
私はサービスクラスから@Statelessアノテーションを削除することを考えましたが、それを行うと、EJBコンテナは、DAOクラスにentityManagerを挿入しません。また、サービスクラスで@Injectアノテーションを使用しようとしましたが、DaoクラスのentityManagerで同じNullPointer例外が発生します。
私は私のプロジェクトで、サンプルコードの実装を追加してい以下:
DAOクラス:
@Stateless
public class CardDaoImpl implements CardDao {
@PersistenceContext(unitName = "test")
protected EntityManager em;
public CardBase addCardToDatabase(CardBase card) {
em.persist(card);
return card;
}
サービスクラス(ここでは、私はbusinessExceptionsを処理する):
@Stateless
public class TestService implements TestServiceIf {
@EJB(beanInterface = CardDao.class)
private CardDao dao;
@Override
public CardBase addCard(CardBase card) {
dao.addCardToDatabase(card);
return card;
}
}
休憩エンドポイントクラス:
@Stateless
@Path("/test")
public class Test {
@EJB(beanInterface = TestServiceIf.class)
private TestServiceIf service;
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String addCard() {
CardBase card = new SampleCard();
//Setting card object fields//
service.addCard(card);
return "Hello";
}
}
これは私が発見した唯一の解決策です。しかし、私のbusinnesExceptionsを投げて何がありますか?おそらく、このサービス層にそれらを投げるのは良い習慣ではないでしょうか?
あなたのサーバーとあなたのEJBのバージョンは何ですか?残念なことに、サーバーによると、EJBの仕様であっても固有性があります。 – davidxxx
私はWildfly 10を使用しています。このアプリケーションサーバーのモジュールでは、EJB3.2 APIが見つかりました –