Аннотации Servlet 3.0 в сочетании с Guice

Я пытаюсь обновить устаревшее приложение Guice, и мне было интересно, есть ли какой-либо предпочтительный способ ведения дел с учетом аннотаций Servlet 3.0. Например, в моем приложении есть фильтр FooFilter, определенный в методе configureServlets() фабрики модулей Guice следующим образом:

    Map<String, String> fooParams = new HashMap<String, String>();
    fooParams.put("someParam", "parameter information");                              
    filter("/foo.jsp","/foo/*").through(com.example.filter.FooFilter.class, fooParams);

Является ли вышеуказанная привязка все еще необходимой или она будет мешать следующему, используя аннотацию @WebFilter Servlet 3.0:

    @Singleton
    @WebFilter(
        filterName="FooFilter",
        urlPatterns={"/foo.jsp", "/foo/*"},
        initParams = {
                    @WebInitParam(name="foo", value="Hello "),
                    @WebInitParam(name="bar", value=" World!")
                 })
    public class FooFilter implements Filter {
    etc....

Какой метод сейчас предпочтительнее? Будут ли они мешать друг другу?


person oberger    schedule 09.11.2013    source источник


Ответы (1)


Я только что сделал быстрый набросок, как может выглядеть поддержка Servlet 3.0. Мог бы быть более элегантный способ просто вызвать filter(Filter Class with WebFilter annotation) в методе configureServlet, но для этого требуется обновить права на модуль guice-servlet, который довольно сложно распространять.

Что ж, я сделал проект на Github: https://github.com/xbaran/guice-servlet3< /а>

все, что вам нужно сделать, это скачать и построить. Он создан поверх Guice 3.0 и работает следующим образом:

new Servlet3Module() {
      @Override
      protected void configureServlets3() {
        scanFilters(FooFilter.class.getPackage());
      }
};

Servlet3Module расширяет ServletModule и содержит метод scanFilters с аргументом package. Этот метод просканирует предоставленный пакет из вашего пути к классам и попытается зарегистрировать все классы с аннотацией WebFilter с помощью метода filter().

Эта scan идея основана на системе конфигурации Sitebricks (веб-фреймворк guice, созданный Дханджи Р. Прасанной).

Честно говоря, я просто делаю черновик, никогда не пробую, если он работает. Но, надеюсь, это будет. Если у вас есть какие-либо проблемы или вопросы, просто дайте мне знать.

PS: При желании можно добавить поддержку сервлетов, слушателей и т.д.

person Milan Baran    schedule 19.11.2013
comment
Милан, вы использовали это в производстве или тестировании? Есть ли сбои после завершения сканирования? - person oberger; 20.11.2013
comment
Я только что проверил код, и он косвенно отвечает на мой вопрос, поскольку сервлеты и фильтры все еще должны быть зарегистрированы через Guice. Спасибо. - person oberger; 20.11.2013
comment
Привет, Guice пока не поддерживает аннотации Servlet 3.0 напрямую. Итак, это своего рода обходной путь, но он делает то, что вам нужно. Как вы сказали, я просто использую Guice API для регистрации фильтров, поэтому не должно быть проблем с его использованием в производстве. - person Milan Baran; 20.11.2013
comment
Милан, вам не кажется, что такой способ может помешать работе настоящего контейнера Servlet 3.0. Это решение будет работать с контейнером сервлета ‹ 3.0. Я имею в виду, что контейнер сервлета 3.0 также попытается зарегистрировать сервлет с помощью собственного механизма сканирования. Я думаю, что в этом случае мы должны подключиться к API/SPI JEE. Как вы думаете ? - person taharqa; 03.10.2014
comment
Тахарка вопрос имеет большой смысл. - person BrunoJCM; 03.08.2015