如何在pax-web中使用@WebServlet和@Component

时间:2015-03-09 15:13:47

标签: apache-karaf apache-servicemix pax-web

我有一个使用Pax-Web WAR-Extender的设置,所以我可以用标准方式注册servlet。

在使用WAR-Extender之前,servlet是一个单例,我能够注入其他osgi-references。使用扩展程序,服务会因为Declarative-Service 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被重新注入?

1 个答案:

答案 0 :(得分:2)

问题是你在这里混合了两种技术。 Pax Web确实确保注释Servlet已相应注册,但对DS没有任何了解。这就是为什么这根本不起作用的原因。 但是如果你将它与Pax-CDI结合使用,你就可以通过CDI方式将任何服务注入你的Servlet。
看一下示例here

这是它的摘录:

 @Inject
 @OsgiService
 private CookBookService cookBookService;

顺便说一下,你也可以将它配置为动态的,这意味着Pax-CDI会在相应的Servlet消失的情况下关闭你的servlet。 有关Pax Web和Pax CDI的更多详细信息,请查看相应的文档/项目 Pax Web Documentation
Pax Web Project
Pax CDI Project