Java 如何将context.getnamedispatcher与Guice Servlet扩展一起使用

Java 如何将context.getnamedispatcher与Guice Servlet扩展一起使用,java,servlets,guice,Java,Servlets,Guice,我正在尝试从maven central及其servlet扩展迁移一个servlet项目,以使用Guice 3.0-rc2。我已经迁移了另一个有同样问题的项目: 由于Guice使web.xml基本上无用,我不知道在哪里定义servlet名称。代码库大量使用ServletContextgetNamedDispatchername,我希望尽量少做更改。第一个代码库只使用了一次getNamedDispatcher,所以我能够解决这个问题 讨论中的servlet没有侦听任何路径,因此使用getReques

我正在尝试从maven central及其servlet扩展迁移一个servlet项目,以使用Guice 3.0-rc2。我已经迁移了另一个有同样问题的项目:

由于Guice使web.xml基本上无用,我不知道在哪里定义servlet名称。代码库大量使用ServletContextgetNamedDispatchername,我希望尽量少做更改。第一个代码库只使用了一次getNamedDispatcher,所以我能够解决这个问题

讨论中的servlet没有侦听任何路径,因此使用getRequesetDispatcher是不行的


有人有什么建议吗?

Guice尝试做的一件大事是不再使用不可靠的字符串标识符,而是使用实际的Java类型来做事情。虽然guice servlet管理的servlet确实有它们绑定为的键的toString名称,但我认为ServletContext不知道它们

一个可能对您有效的选项是,实际注入您希望能够向其传递请求的servlet,并直接自己执行:

@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中注册servlet。。。我认为您可以使用service.withTestServlet2.class,这样就不会将它映射到任何URL。

Guice尝试做的一件大事就是不再使用不可靠的字符串标识符,而是使用实际的Java类型来做事情。虽然guice servlet管理的servlet确实有它们绑定为的键的toString名称,但我认为ServletContext不知道它们

一个可能对您有效的选项是,实际注入您希望能够向其传递请求的servlet,并直接自己执行:

@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中注册servlet。。。我想您可以为.withTestServlet2.class提供服务,这样就不会将其映射到任何URL。

很抱歉,这对我不起作用。我特别需要一种方法来确定/分配servlet的名称,因为它们也是我不想接触的路由规则引擎的一部分。@msung:我猜这涉及到通过一些过滤器将请求路由到servlet之类的?如果没有,一个选项可能是使用多重绑定扩展中的MapBinder绑定servlet,使用与之前在web.xml中相同的名称,然后在映射中查找它们,而不是使用RequestDispatcher。否则,我认为您想要的可能超出了guice servlet的设计范围。据我所知,查找servlet是可行的。在您的示例中选择使用方法注入有什么特别的原因吗?直接注入servlet或getInstanceYourServlet.class不起作用吗?@msung:我的示例使用构造函数注入并直接注入servlet,所以我不太确定你在问什么。当然,可以使用injector.getInstance来获取任何可以注入的对象的实例,但是在大多数应用程序中通常不应该直接使用injector。。。只有在非常特殊的情况下,类需要能够执行某种动态查找,而且通常还有其他选项。对不起,这对我不起作用。我特别需要一种方法来确定/分配servlet的名称,因为它们也是我不想接触的路由规则引擎的一部分。@msung:我猜这涉及到通过一些过滤器将请求路由到servlet之类的?如果没有,一个选项可能是使用多重绑定扩展中的MapBinder绑定servlet,使用与之前在web.xml中相同的名称,然后在映射中查找它们,而不是使用RequestDispatcher。否则,我认为您想要的可能超出了guice servlet的设计范围。据我所知,查找servlet是可行的。在您的示例中选择使用方法注入有什么特别的原因吗?直接注入servlet或getInstanceYourServlet.class不起作用吗?@msung:我的示例使用构造函数注入并直接注入servlet,所以我不太确定你在问什么。当然,可以使用injector.getInstance来获取任何可以注入的对象的实例,但是在大多数应用程序中通常不应该直接使用injector。。。只有在非常特定的情况下,类需要能够执行某种动态查找,甚至通常还有其他选项。