OSGi 환경에서 실행되는 HttpServlet (즉, OSGi HttpService에 등록 됨)은 작업을 수행하기 위해 일부 OSGi 서비스를 호출하기를 원할 것입니다. 문제는 서블릿 내부에서 이러한 OSGi 서비스에 대한 참조를 얻는 방법입니다.OSGi HttpService에 등록 된 서블릿에서 OSGi 서비스 참조를 얻는 방법은 무엇입니까?
한 가지 방법은 OSGi HttpService를이 같은 등록되고있는 HttpServlet을 인스턴스에 종속성을 주입하는 것입니다 :이 비은 OSGi 환경에서부터 유효한 방법 인 경우
MyServlet servlet = new MyServlet();
servlet.setFooService(fooService);
httpService.registerServlet("/myservlet", servlet, initparams, context);
잘 모르겠어요 서블릿 라이프 사이클은 웹 컨테이너에 의해 관리되므로 나중에 작성된 서블릿 인스턴스에 서비스 참조가 삽입되지 않습니다.
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 화이트 보드는 서블릿 등록을위한 훌륭한 솔루션입니다. 감사. 그러나 주된 문제는 OSGi 환경에서 서블릿 내에서 서비스 참조를 얻는 방법입니다. JNDI 조회를 언급했지만 OSGi 서비스 레지스트리에 액세스하는 올바른 방법이라고 생각하지 않습니다. 그런 다음 서블릿 컨텍스트에 대해서도 언급했지만 OSGi HttpService 인터페이스를 사용하여 서블릿 컨텍스트에 객체를 배치하는 방법은 없습니다. 내가 틀렸다면 나를 바로 잡아주세요. –
SCR을 사용하여 OSGi 내부에서 종속성을 확보 할 수 있습니다. 핵심은 종속성을 주입하는 데 사용하는 setter (setFooService 등)가 있다는 것입니다. 이 설정 도구는 BundleActivator (예를 들어 사용자가 보여준 것과 같은), SCR, iPojo, Spring 등에서 수동으로 호출 할 수 있습니다. 이러한 서비스는 서비스 추적을 처리합니다. – Thilo
다시 말하면, 서블릿 자체가 의존성을 찾지 않는다는 점입니다. 그것들을 어디 론가 주사하게하는 세터가 있습니다. OSGi 내부에서는 JNDI를 사용하지 않을 것입니다. 이것은 다른 DI 메커니즘이없는 경우 동일한 서블릿을 OSGi 외부에서 작동시키는 방법의 예입니다. – Thilo