Как использовать context.getNamedDispatcher с расширением сервлета Guice

Я пытаюсь перенести проект сервлета для использования Guice 3.0-rc2 (из центра maven) и его расширения сервлета. Я уже перенес другой проект, где у меня была такая же проблема:

Поскольку Guice делает web.xml в основном бесполезным, я понятия не имею, где определить имена моих сервлетов. Кодовая база довольно интенсивно использует ServletContext#getNamedDispatcher("name"), и я хотел бы изменить как можно меньше. Первая кодовая база использовала getNamedDispatcher только один раз, так что я смог обойти это.

Рассматриваемые сервлеты не прослушивают ни один путь, поэтому использование getRequesetDispatcher не подходит.

У кого-нибудь есть предложения?


person msung    schedule 27.01.2011    source источник


Ответы (1)


Одна из важных вещей, которую пытается сделать Guice, — это перейти от использования ненадежных идентификаторов String к использованию реальных типов Java для выполнения задач. Хотя сервлеты, управляемые guice-servlet, имеют имена (toString() из Key, с которыми они связаны), я не думаю, что ServletContext знает о них.

Один из вариантов, который может сработать для вас, — фактически внедрить сервлет(ы), которым вы хотите передавать запросы, и сделать это самостоятельно:

@Singleton
public class TestServlet extends HttpServlet {
  private final TestServlet2 testServlet2;

  @Inject public TestServlet(TestServlet2 testServlet2) {
    this.testServlet2 = testServlet2;
  }

  @Override
  protected void doGet(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse)
      throws ServletException, IOException {
    testServlet2.doGet(httpServletRequest, httpServletResponse);
  }
}

Чтобы это работало, вам нужно зарегистрировать сервлеты в вашем ServletModule... Я думаю, вы можете serve("").with(TestServlet2.class) не сопоставлять его с каким-либо URL-адресом.

person ColinD    schedule 27.01.2011
comment
Извините, это не сработает для меня. Мне особенно нужен способ определить/назначить имена сервлетов, потому что они также являются частью некоторого механизма правил маршрутизации, который я бы не хотел трогать. - person msung; 28.01.2011
comment
@msung: я предполагаю, что это связано с маршрутизацией запросов через некоторые фильтры к сервлетам и тому подобному? Если нет, одним из вариантов может быть привязка сервлетов с использованием MapBinder (из расширения multibinding) с использованием тех же имен, что и в web.xml ранее, а затем поиск их в Map вместо использования RequestDispatcher. В противном случае я думаю, что то, что вы хотите, вероятно, выходит за рамки того, для чего предназначен guice-servlet. - person ColinD; 31.01.2011
comment
Я обошел эту проблему, сопоставив ранее использовавшиеся имена сервлетов с их классами. Насколько я могу судить, поиск сервлетов работает. Есть ли конкретная причина, по которой вы решили использовать метод внедрения в своем примере? Не сработает ли внедрение сервлета напрямую или getInstance(YourServlet.class)? - person msung; 02.02.2011
comment
@msung: в моем примере используется внедрение конструктора и внедрение сервлета напрямую, поэтому я не совсем уверен, о чем вы спрашиваете. injector.getInstance, конечно, можно использовать для получения экземпляра любого объекта, который можно внедрить, но, как правило, вы не должны использовать injector напрямую в большинстве приложений... только в очень специфических случаях, когда класс должен иметь возможность выполнять какие-то действия. динамического поиска, да и то есть вообще другие варианты. - person ColinD; 02.02.2011