我正在尝试使用Google App Engine上的Jersey创建RESTFul Web服务。我正在尝试添加Guice for Dependency injection。
我在web.xml中添加了以下内容
<listener>
<listener-class>com.archit.guice.GuiceListener</listener-class>
</listener>
<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>
我还在com.archit.guice包中定义了一个类GuiceListener。
GuiceListener类中的代码是:
public class GuiceListener extends GuiceServletContextListener {
private ServletContext servletContext = null;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
servletContext = servletContextEvent.getServletContext();
super.contextInitialized(servletContextEvent);
}
@Override
protected Injector getInjector() {
return Guice.createInjector(new GuiceServletModule(),
new MainShiroWebModule(servletContext), ShiroWebModule.guiceFilterModule());
}
}
当我将应用程序部署到appengine并调用任何REST API时,我收到404错误,并且appengine中提供的错误日志是:
Could not instantiate listener com.archit.guice.GuiceListener
java.lang.ClassNotFoundException: com.archit.guice.GuiceListener
at com.google.appengine.runtime.Request.process-08b248c3657c5fb3(Request.java)
at java.lang.ClassLoader.loadClass(ClassLoader.java:375)
at org.mortbay.jetty.handler.ContextHandler.loadClass(ContextHandler.java:1101)
at org.mortbay.jetty.webapp.WebXmlConfiguration.initListener(WebXmlConfiguration.java:630)
at org.mortbay.jetty.webapp.WebXmlConfiguration.initWebXmlElement(WebXmlConfiguration.java:368)
at org.mortbay.jetty.webapp.WebXmlConfiguration.initialize(WebXmlConfiguration.java:289)
at org.mortbay.jetty.webapp.WebXmlConfiguration.configure(WebXmlConfiguration.java:222)
at org.mortbay.jetty.webapp.WebXmlConfiguration.configureWebApp(WebXmlConfiguration.java:180)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:453)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:460)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:319)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:311)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:457)
at java.lang.Thread.run(Thread.java:745)
即使我已经定义了类,ClassNotFoundException的原因可能是什么。 我已尝试使用
进行干净构建mvn clean package
答案 0 :(得分:0)
好吧,这是一个非常愚蠢的错误。类GuiceListener没有任何问题,但在我的包中的其他类中,包名称不正确,因为maven实际上没有构建.class文件(即使它在构建时没有给出任何错误)。在更正了其他类中的包名后,它工作正常。
答案 1 :(得分:0)
是的,我也一样。如果您遵循Google的说明,则可能会遇到与我相同的错误。在web.xml
中写:
<listener-class>com.example.echo.EchoGuiceListener</listener-class>
代替
<listener-class>com.example.skeleton.EchoGuiceListener</listener-class>