如何在 pax-web 中使用@WebServlet 和@Component
How to use @WebServlet and @Component in pax-web
我有一个使用 Pax-Web WAR-Extender 的设置,因此我可以以标准方式注册 servlet。
在使用 WAR-Extender 之前,servlet 是一个单例,我可以在其中注入其他 osgi 引用。使用扩展器,由于声明式服务 XML,服务被注入,但是当我使用浏览器访问 Servlet 时,会创建一个新实例,而不会注入其他服务。
@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。是否有任何配置使我的 Servlet 被视为单例或重新注入 OSGi 服务?
问题是您在这里混合了两种技术。 Pax Web 确实确保 Annotated Servlet 已相应注册,但对 DS 一无所知。这就是为什么这根本不起作用。
但是,如果您将它与 Pax-CDI 结合使用,您就可以通过 CDI 方式将任何服务注入到您的 Servlet 中。
看一个例子 here
这是它的节选:
@Inject
@OsgiService
private CookBookService cookBookService;
顺便说一句,您也可以将其配置为动态的,这意味着 Pax-CDI 将在相应的 Servlet 消失的情况下关闭您的 servlet。
有关 Pax Web 和 Pax CDI 的更多详细信息,请查看相应的 Documentations/Projects.
大同网 Documentation
大同网 Project
帕克斯 CDI Project
我有一个使用 Pax-Web WAR-Extender 的设置,因此我可以以标准方式注册 servlet。
在使用 WAR-Extender 之前,servlet 是一个单例,我可以在其中注入其他 osgi 引用。使用扩展器,由于声明式服务 XML,服务被注入,但是当我使用浏览器访问 Servlet 时,会创建一个新实例,而不会注入其他服务。
@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。是否有任何配置使我的 Servlet 被视为单例或重新注入 OSGi 服务?
问题是您在这里混合了两种技术。 Pax Web 确实确保 Annotated Servlet 已相应注册,但对 DS 一无所知。这就是为什么这根本不起作用。
但是,如果您将它与 Pax-CDI 结合使用,您就可以通过 CDI 方式将任何服务注入到您的 Servlet 中。
看一个例子 here
这是它的节选:
@Inject
@OsgiService
private CookBookService cookBookService;
顺便说一句,您也可以将其配置为动态的,这意味着 Pax-CDI 将在相应的 Servlet 消失的情况下关闭您的 servlet。
有关 Pax Web 和 Pax CDI 的更多详细信息,请查看相应的 Documentations/Projects.
大同网 Documentation
大同网 Project
帕克斯 CDI Project