我正在使用手动缩放模式的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。