【问题标题】:Cannot Instantiate listener guiceListner, ClassNotFoundException无法实例化侦听器 guiceListner,ClassNotFoundException
【发布时间】:2017-07-30 15:27:29
【问题描述】:

我正在尝试在 Google App Engine 上使用 Jersey 创建一个 RESTFul 网络服务。我正在尝试为依赖注入添加 Guice。

我在 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

【问题讨论】:

    标签: java google-app-engine jersey guice


    【解决方案1】:

    好吧,这是一个非常愚蠢的错误。 GuiceListener 类没有任何问题,但在我的包中的其他一些类中,包名称不正确,因为 maven 实际上并没有构建 .class 文件(即使它在构建时没有给出任何错误)。更正其他类中的包名称后,它工作正常。

    【讨论】:

      【解决方案2】:

      是的,我也一样。如果您按照 Google 的说明进行操作,您可能会陷入与我相同的错误。在web.xml 写:

      &lt;listener-class&gt;com.example.echo.EchoGuiceListener&lt;/listener-class&gt;

      而不是

      &lt;listener-class&gt;com.example.skeleton.EchoGuiceListener&lt;/listener-class&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 2019-12-02
        • 2014-01-02
        • 2015-06-10
        • 2013-07-25
        • 1970-01-01
        • 2018-05-13
        相关资源
        最近更新 更多