Как использовать @WebServlet и @Component в pax-web

У меня есть настройка, в которой я использую Pax-Web WAR-Extender, поэтому я могу регистрировать сервлеты стандартным образом.

До использования WAR-Extender сервлет был одноэлементным, в который я мог вводить другие ссылки osgi. С помощью расширителя службы внедряются из-за XML декларативной службы, но когда я обращаюсь к сервлету с помощью браузера, создается новый экземпляр без внедрения другой службы.

@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. Есть ли какая-либо конфигурация, чтобы мой сервлет рассматривался как синглтон или чтобы OSGi-Service повторно вводился?


person lostiniceland    schedule 09.03.2015    source источник


Ответы (1)


Проблема в том, что вы смешиваете здесь две технологии. Pax Web обеспечивает соответствующую регистрацию аннотированных сервлетов, но ничего не знает о DS. Вот почему это вообще не работает. Но если вы используете его в сочетании с Pax-CDI, вы можете внедрить любой сервис в свой сервлет с помощью CDI.
Взгляните на пример здесь

Это отрывок из него:

 @Inject
 @OsgiService
 private CookBookService cookBookService;

Кстати, вы также можете настроить его как динамический, это означает, что Pax-CDI отключит ваш сервлет, если соответствующий сервлет исчезнет. Дополнительные сведения о Pax Web и Pax CDI см. в соответствующих Документациях/Проектах.
Pax Web Документация
Pax Web Проект
Pax CDI Проект

person Achim Nierbeck    schedule 10.03.2015