0

Pax-Web WAR-Extender を使用するセットアップがあるので、標準的な方法でサーブレットを登録できます。

WAR-Extender を使用する前は、サーブレットは、他の osgi 参照を挿入できるシングルトンでした。エクステンダーを使用すると、Declarative-Service XML によりサービスが注入されますが、ブラウザーでサーブレットにアクセスすると、他のサービスを注入せずに新しいインスタンスが作成されます。

@Component
@SuppressWarnings("serial")
@WebServlet(name="TestServlet", urlPatterns={"/Test"})
public class TestServlet extends HttpServlet{

    private UserDataManager userDataManager;

    public TestServlet(){
        System.out.println("------------------- New Servlet");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        MbsSessionId mbsId = (MbsSessionId)session.getAttribute("MbsSessionId");

        UserData userData = userDataManager.getUserData(mbsId);         
        resp.getOutputStream().println(userData.toString());
    }

    @Reference
    void bindUserDataManager(UserDataManager userDataManager){
        this.userDataManager = userDataManager;
    }
}

私の目標は、OSGi-Service-Registry をプログラムで呼び出さないようにすることです。サーブレットがシングルトンとして扱われるように、または OSGi サービスが再注入されるように、構成はありますか?

4

1 に答える 1

2

問題は、ここで 2 つのテクノロジを混在させていることです。Pax Web は、注釈付きサーブレットが適切に登録されていることを確認しますが、DS については何も知りません。そのため、これはまったく機能しません。しかし、Pax-CDI と組み合わせて使用​​すると、CDI によって任意のサービスをサーブレットに注入できます。ここ
でサンプルを見てみましょう

これはその抜粋です:

 @Inject
 @OsgiService
 private CookBookService cookBookService;

ちなみに、動的に構成することもできます。つまり、対応するサーブレットがなくなった場合、Pax-CDI がサーブレットを停止します。Pax Web および Pax CDI の詳細については、対応するドキュメント/プロジェクトを参照してください。
Pax Webドキュメンテーション
Pax Webプロジェクト
Pax CDIプロジェクト

于 2015-03-10T07:24:38.970 に答える