0

我有一个使用 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 被视为 Singleton 或 OSGi-Service 被重新注入?

4

1 回答 1

2

问题是你在这里混合了两种技术。Pax Web 确实确保相应地注册了带注释的 Servlet,但对 DS 一无所知。这就是为什么这根本不起作用。但是,如果您将它与 Pax-CDI 结合使用,您就可以通过 CDI 方式将任何服务注入到您的 Servlet 中。
看看这里的样本

这是它的摘录:

 @Inject
 @OsgiService
 private CookBookService cookBookService;

顺便说一句,您还可以将其配置为动态的,这意味着 Pax-CDI 将关闭您的 servlet,以防相应的 Servlet 消失。有关 Pax Web 和 Pax CDI 的更多详细信息,请查看相应的文档/项目。
Pax Web文档
Pax Web项目
Pax CDI项目

于 2015-03-10T07:24:38.970 回答