OSGi環境で動作するHttpServlet(つまり、OSGi HttpServiceに登録されている)は、タスクを達成するためにいくつかのOSGiサービスを呼び出したいと思うのは当然です。問題は、サーブレット内のこれらのOSGiサービスへの参照を取得する方法です。私は、これは非OSGiの環境であるため、有効なアプローチであるかどうかわからないんだけどOSGi HttpServiceに登録されているサーブレットからOSGiサービス参照を取得する方法は?
MyServlet servlet = new MyServlet();
servlet.setFooService(fooService);
httpService.registerServlet("/myservlet", servlet, initparams, context);
:
一つの方法は、このようなOSGiのHTTPServiceのに登録されているHttpServletのインスタンスに依存性を注入することであろうサーブレットのライフサイクルはWebコンテナによって管理されるため、後で作成されたサーブレットインスタンスに対してはサービス参照が注入されません。
PAX WebをOSGi HttpServiceの実装として使用する場合、これを解決する別の方法があります。 PAX WebはOSGi BundleContextを特別な属性 "osgi-bundlecontext"としてServletContextにエクスポートします。 BundleContextは、必要に応じてサービス参照を取得するために使用することができます。
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext context = servletConfig.getServletContext()
BundleContext bundleContext =
(BundleContext) context.getAttribute("osgi-bundlecontext");
ServiceReference serviceRef =
bundleContext.getServiceReference("com.foo.FooService")
}
しかし、このアプローチはかなり醜いですとOSGi HTTPServiceのの具体的な実装にあなたを結び付けます。あなたはこの問題の他の(そしておそらくもっと良い)解決策を知っていますか?
Pax Web Extender Whiteboardは、サーブレットを登録するための素晴らしいソリューションのようです。ありがとう。しかし、主な問題は、OSGi環境でサーブレット内からサービス参照を取得する方法です。 あなたはJNDIルックアップについて言及しましたが、OSGiサービスレジストリにアクセスする正しい方法とは感じられません。次に、サーブレット・コンテキストについても触れましたが、OSGi HttpServiceインタフェースを使用してサーブレット・コンテキストにオブジェクトを配置する方法はありません。私が間違っているなら、私を修正してください。 –
SCRを使用すると、OSGi内で依存関係を取得できます。要点は、依存関係を注入するために使用するsetter(setFooServiceなど)があることです。そのセッターはBundleActivator(あなたの例で示すように)、SCR、iPojo、Spring、または何でも手動で呼び出すことができます。これらのサービスはサービストラッキングを担当します。 – Thilo
ここでも、サーブレット自体がその依存関係を検索しないことがポイントです。それは彼らがどこかから注射されるようになっています。 OSGiの内部ではJNDIを使用しません。これは、他のDIメカニズムがない場合でも、同じサーブレットをOSGiの外部で動作させる方法の例です。 – Thilo