質問

@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つの方法があります。

  1. ジャージーが管理するライフサイクル、CDIによってインスタンス化されました。で注釈を付けます @ManagedBean オプションでは、ジャージースコープアノテーションで注釈を付けます。

  2. CDIによってインスタンス化および管理されています。のようなCDIスコープアノテーションで注釈を付けます @RequestScoped (いいえ @ManagedBean必要とされている)

また、以下のリソースを確認することもお勧めします。

そして、これはアプリケーションを配線するための好ましい方法ですか?

はいと言います。 CDIはとてもいいです...注射は好きではありませんか?

まあ、私はエンティティマネージャーをプロデューサーに引き出すことを考えています。

何の間で共有されますか?なぜ?あなたの場合、あなたはanを使用する必要があります EntityManager 単一のトランザクションにスコープされる生涯で( トランザクションスコープ付き永続性コンテキスト)。言い換えれば、それを共有しないでください(そして、リクエストごとにそれを開閉することを心配しないでください、これは高価な操作ではありません)。

参照

  • JPA 2.0仕様
    • セクション7.6「コンテナ管理された永続性コンテキスト」
    • セクション7.6.1「コンテナ管理されたトランザクションスコープ持続性コンテキスト」
    • セクション7.6.2「コンテナ管理された拡張永続性コンテキスト」

資力

他のヒント

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top