2009-09-28 11 views
5

Attualmente sto sperimentando con GWT e Spring. Più in particolare, volevo che l'esempio di GreetingService funzionasse con Spring sul lato server. Ci sono un paio di articoli disponibili per la realizzazione di questo (io li sto collegando le qui dato che alcuni di voi potrebbero essere interessati):GWT + Spring: NullPointerException su getServletContext() chiama

Ora ho seguito le istruzioni indicate e quando si avvia tutto nella modalità ospitata GWT, viene chiamato anche il servizio sul lato server. Ma prima che la risposta venga inviata al client, ottengo l'eccezione NullPointerException quando getServletContext() viene chiamato internamente da qualche classe Spring Framework. Lo StackTrace è il seguente:

WARNING: Nested in org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException: 
java.lang.NullPointerException 
    at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:163) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.doUnexpectedFailure(RemoteServiceServlet.java:284) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:99) 
    at com.jsdev.devbook.server.GWTController.handleRequest(GWTController.java:51) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:781) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:726) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:636) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:556) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:313) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
    at org.mortbay.jetty.Server.handle(Server.java:313) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) 
    at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) 

Ecco l'elenco dei librerie schiero sul mio server/GWT ospitato directory modalità:

antlr-3.0.1.jar 
appengine-api-1.0-sdk-1.2.5.jar 
appengine-api-labs-1.2.5.jar 
commons-logging.jar 
datanucleus-appengine-1.0.3.jar 
datanucleus-core-1.1.5.jar 
datanucleus-jpa-1.1.5.jar 
geronimo-jpa_3.0_spec-1.1.1.jar 
geronimo-jta_1.1_spec-1.1.1.jar 
geronimo-servlet_2.5_spec-1.2.jar 
gwt-servlet.jar 
jdo2-api-2.3-eb.jar 
org.springframework.asm-3.0.0.RC1.jar 
org.springframework.beans-3.0.0.RC1.jar 
org.springframework.context-3.0.0.RC1.jar 
org.springframework.context.support-3.0.0.RC1.jar 
org.springframework.core-3.0.0.RC1.jar 
org.springframework.expression-3.0.0.RC1.jar 
org.springframework.orm-3.0.0.RC1.jar 
org.springframework.web-3.0.0.RC1.jar 
org.springframework.web.servlet-3.0.0.RC1.jar 
spring-dao.jar 

Ancora più informazioni:
sviluppare su Mac OSX, Java versione 1.6 .0_15.

Qualcuno ha la minima idea di quale potrebbe essere il problema qui?

Thx molto.

risposta

4

Ho appena trovato il problema. L'implementazione GWTController deve essere resa consapevole del contesto Servlet. Questo può essere fatto implementando l'interfaccia ServletContextAware e sovrascrivendo i metodi getServletContext() e setServletContext(..) per consentire l'inserimento del contesto.

Ho appena published a blog post che descrive il problema e fornisce la soluzione in modo più dettagliato.

0

Abbiamo riscontrato un problema simile e abbiamo riscontrato che il campo private transient ServletConfig config su javax.servlet.GenericServlet era nullo. GWT's RemoteServiceServlet stava chiamando log(...) che a sua volta chiamato getServletName() quale NPE a causa di config essere nullo.

La nostra soluzione è stata quella overide getServletName():

public String getServletName() { 
    // Override as GenericServlet does config.getServletName() which NPEs 
    // as config is null. This causes NPEs when the log(...) methods are 
    // invoked. 
    return service.getClass().getSimpleName(); 
} 

Si potrebbe capire perché la ServletConfig non viene impostata o sovrascrivere alcuni metodi come abbiamo fatto noi.

+0

thx per il suggerimento, ma sembra che il mio problema sia ancora peggio. Non ho solo un NPE sul ServletName, ma già sul ServletContext nel suo complesso. Sembra che il problema si trovi nel contenitore della servlet ... Forse un problema OSX con GWT? – Juri

Problemi correlati