无法实例化侦听器guiceListner,ClassNotFoundException

时间:2017-07-30 15:27:29

标签: java google-app-engine jersey guice

我正在尝试使用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

2 个答案:

答案 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>