Es scheint natürlich, dass ein HttpServlet, das in einer OSGi-Umgebung läuft (d. H. In OSGi HttpService registriert), einige OSGi-Dienste aufrufen würde, um seine Aufgaben zu erledigen. Die Frage ist, wie Referenzen auf diesen OSGi-Service innerhalb des Servlets erhalten werden.Wie erhält man OSGi-Service-Referenzen von einem Servlet, das in OSGi HttpService registriert ist?
Eine Möglichkeit wäre, Abhängigkeiten in die HttpServlet Instanz zu injizieren, der Httpservice wie dies den OSGi registriert wird:
MyServlet servlet = new MyServlet();
servlet.setFooService(fooService);
httpService.registerServlet("/myservlet", servlet, initparams, context);
Ich bin mir nicht sicher, ob dies, da in nicht-OSGi-Umgebung ein gültiger Ansatz ist Der Servlet-Lebenszyklus wird vom Webcontainer verwaltet und daher wird die Servicereferenz für die Servlet-Instanzen, die später erstellt werden, nicht injiziert.
Es gibt eine andere Möglichkeit, dies zu lösen, wenn Sie PAX Web als eine Implementierung des OSGi HttpService verwenden. PAX Web exportiert den OSGi BundleContext als spezielles Attribut "osgi-bundlecontext" in den ServletContext. Die Bundlecontext kann dann dazu verwendet werden, die notwendig Service Referenzen zu erhalten:
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")
}
Doch dieser Ansatz ist ziemlich hässlich und bindet Sie an eine konkrete Implementierung der OSGi Httpservice. Kennen Sie eine andere (und möglicherweise bessere) Lösung für dieses Problem?
Das Pax Web Extender Whiteboard sieht wie eine nette Lösung für die Registrierung von Servlets aus. Vielen Dank. Die Hauptfrage ist jedoch, wie Service-Referenzen aus dem Servlet in der OSGi-Umgebung bezogen werden. Sie haben JNDI-Lookup erwähnt, aber es ist nicht der richtige Weg, um auf die OSGi-Service-Registry zuzugreifen. Dann haben Sie auch den Servletkontext erwähnt, aber es gibt keine Möglichkeit, Objekte mithilfe der OSGi HttpService-Schnittstelle in den Servletkontext zu stellen. Bitte korrigieren Sie mich, falls ich falsch liege. –
Sie können SCR verwenden, um Abhängigkeiten innerhalb von OSGi zu erhalten. Der Punkt ist, dass Sie nur einen Setter haben (wie setFooService), den Sie verwenden, um die Abhängigkeit zu injizieren. Dieser Setter kann manuell von einem BundleActivator aufgerufen werden (wie Sie in Ihrem Beispiel zeigen), von SCR, von iPojo, von Spring oder was auch immer. Diese Dienste kümmern sich um das Service-Tracking. – Thilo
Noch einmal, der Punkt ist, dass das Servlet selbst seine Abhängigkeiten nicht nachschlägt. Es hat Setter, um sie von irgendwo injiziert zu bekommen. Sie würden JNDI nicht innerhalb von OSGi verwenden. Das war ein Beispiel dafür, wie Sie dasselbe Servlet auch außerhalb von OSGi in Abwesenheit anderer DI-Mechanismen einsetzen können. – Thilo