2017-07-30 5 views
0

J'essaie de créer un service Web RESTFul en utilisant Jersey sur Google App Engine. J'essaye d'ajouter l'injection de Guice pour la dépendance.Impossible d'instancier l'écouteur guiceListner, ClassNotFoundException

J'addeded ce qui suit dans le 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> 

J'ai également défini une GuiceListener de classe dans le package com.archit.guice.

Le code dans la GuiceListener classe est:

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()); 
    } 
} 

Quand je déploie l'application pour AppEngine et appeler une API REST, je reçois 404 erreur et le journal des erreurs figurant dans AppEngine est:

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) 

Quelle pourrait être la raison de ClassNotFoundException même si j'ai défini la classe. J'ai essayé construction propre à l'aide était

mvn clean package 

Répondre

0

Ok une erreur vraiment stupide. Il n'y avait rien de mal dans la classe GuiceListener, mais dans une autre classe de mon paquet, le nom du paquet était incorrect, maven n'étant pas en train de construire le fichier .class (même s'il ne donnait aucune erreur lors de la construction). Après avoir corrigé le nom du paquet dans cette autre classe, cela fonctionne correctement.