CDI + WS/RS + JPAを使用してアプリを構築する
質問
@Path(value = "/user")
@Stateless
public class UserService {
@Inject
private UserManager manager;
@Path(value = "/create")
@GET
@Produces(value = MediaType.TEXT_PLAIN)
public String doCreate(@QueryParam(value = "name") String name) {
manager.createUser(name);
return "OK";
}
}
これがユーザーマネージャーのemplです
public class UserManager {
@PersistenceContext(unitName = "shop")
private EntityManager em;
public void createUser(String name) {
User user = new User();
user.setName(name);
// skip some more initializations
em.persist(user);
}
}
問題は、userserviceを@Statelessとしてマークしない場合、マネージャーフィールドはnullです
しかし、@Statelessをマークすると、マネージャーフィールドを注入することができ、データをDBに保存できるようにアプリケーションを機能させることができます。
疑問に思っているだけで、この背後にある理由は何ですか?
そして、これはアプリケーションを配線するための好ましい方法ですか?
まあ、私はエンティティマネージャーをプロデューサーに引き出すことを考えています。
解決
問題は、userserviceを@Statelessとしてマークしない場合、マネージャーフィールドはnullです
注射が発生するには、クラスは 管理されたコンポーネント エンタープライズ豆、サーブレット、フィルター、JSFマネージドビーンズなどなど CDIマネージドビーン (これはJava EE 6の新しい部分です。CDIを使用してクラスAマネージドビーンを作成できます)。
それで、Jax-RSエンドポイントをEJBにしない場合、噴射を有効にする方法は?これはうまく説明されています Glassfish V3を使用したJAX-RSおよびCDI統合:
CDIマネージドビーンズが有効になる2つの方法があります。
ジャージーが管理するライフサイクル、CDIによってインスタンス化されました。で注釈を付けます
@ManagedBean
オプションでは、ジャージースコープアノテーションで注釈を付けます。CDIによってインスタンス化および管理されています。のようなCDIスコープアノテーションで注釈を付けます
@RequestScoped
(いいえ@ManagedBean
必要とされている)
また、以下のリソースを確認することもお勧めします。
そして、これはアプリケーションを配線するための好ましい方法ですか?
はいと言います。 CDIはとてもいいです...注射は好きではありませんか?
まあ、私はエンティティマネージャーをプロデューサーに引き出すことを考えています。
何の間で共有されますか?なぜ?あなたの場合、あなたはanを使用する必要があります EntityManager
単一のトランザクションにスコープされる生涯で( トランザクションスコープ付き永続性コンテキスト)。言い換えれば、それを共有しないでください(そして、リクエストごとにそれを開閉することを心配しないでください、これは高価な操作ではありません)。
参照
- JPA 2.0仕様
- セクション7.6「コンテナ管理された永続性コンテキスト」
- セクション7.6.1「コンテナ管理されたトランザクションスコープ持続性コンテキスト」
- セクション7.6.2「コンテナ管理された拡張永続性コンテキスト」
資力
他のヒント
@singleton 注釈は役立ちます: http://www.mentby.com/paul-sandoz/jax-rs-on-glassfish-31-ejb-injection.html