当模块设置为手动缩放时,Appengine服务器上的Guice Filter返回404

时间:2016-02-26 16:33:55

标签: java google-app-engine servlets guice

我正在使用手动缩放模式的appengine dev服务器。 GuiceFilter用于为我的servlet提供服务。当在开发服务器上运行时,当我通过模块端口访问servlet时,GuiceFilter将返回404,但如果我尝试通过其中一个实例端口访问它,它将正常工作。

以下是我的appengine-web.xml的摘录:

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>${appengine.app.name}</application>
    <version>${appengine.app.version}</version>
    <threadsafe>true</threadsafe>
    <manual-scaling>
        <instances>1</instances>
    </manual-scaling>
</appengine-web-app>

我在web.xml中使用guiceFilter:

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我的GuiceFilter定义为:

public class GuiceModule extends GuiceSystemServiceServletModule {
  @Override
  protected void configureServlets() {
    super.configureServlets();
  }
}

public class GuiceConfig extends GuiceServletContextListener {
  protected Injector getInjector() {
    return Guice.createInjector(
        new GuiceModule(),
        new ServletModule() {
          @Override
          protected void configureServlets() {
            serve("/testGuiceServlet").with(TestServlet.class);
          }
        });
  }
}

我使用以下命令运行dev服务器:

mvn appengine:devserver

此时我可以观察类似于以下的日志:

Module instance default is running at http://localhost:8080/
Module instance default instance 0 is running at http://localhost:61190/

如果我尝试通过http://localhost:61190/testGuiceServlet访问我的servlet,它将起作用。但是当我尝试使用模块端口http://localhost:8080/testGuiceServlet时,会返回404!

在日志中,我可以阅读:

[INFO] Feb 26, 2016 6:35:48 PM com.google.appengine.tools.development.LocalResourceFileServlet doGet
[INFO] WARNING: No file found for: /testGuiceServlet

如果我在web.xml中使用标准Servlet而不是GuiceFilter,那么我就不会遇到这样的问题。如果我使用动态缩放而不是手动缩放,我也不会遇到任何此类问题。它也适用于制作Appengine。

1 个答案:

答案 0 :(得分:0)

问题不在Guice中,而是在使用devserv的过滤器中。 请参阅一些解决方法here