2009-09-28 13 views
5

Actualmente estoy experimentando con GWT y Spring. Más específicamente, quería hacer que la muestra GreetingService funcionara con Spring en el lado del servidor. Hay un par de artículos disponibles para la realización de este (que une los estoy aquí, ya que algunos de ustedes pueden estar interesados):GWT + Spring: NullPointerException en getServletContext() call

Ahora he seguido las instrucciones mencionadas y al iniciar todo en el modo alojado de GWT, el servicio en el lado del servidor también se llama con éxito. Pero antes de que la respuesta se envíe de vuelta al cliente, obtengo una NullPointerException cuando una clase de marco Spring llama al getServletContext() internamente. El StackTrace es la siguiente:

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) 

Aquí está la lista de librerías puedo implementar en mi servidor/GWT alojado directorio modo:

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 

Aún más información:
desarrollar en Mac OS X, Java versión 1.6 .0_15.

¿Alguien tiene una pista de lo que podría ser el problema aquí?

Thx mucho.

Respuesta

4

Acaba de encontrar el problema. La implementación GWTController tiene que hacerse consciente del contexto del servlet. Esto puede hacerse implementando la interfaz ServletContextAware y reemplazando los métodos getServletContext() y setServletContext(..) para permitir que se inserte el contexto.

Solo published a blog post que describe el problema y proporciona la solución con más detalle.

0

Tuvimos un problema similar y descubrimos que el campo private transient ServletConfig config en javax.servlet.GenericServlet era nulo. El RemoteServiceServlet de GWT llamaba al log(...) que a su vez llamaba a getServletName() que NPE debido a config era nulo.

Nuestra solución fue 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(); 
} 

Se puede averiguar por qué el ServletConfig no se está creando o anular algunos métodos como lo hicimos.

+0

thx por la pista, pero parece que mi problema es aún peor. No solo tengo un NPE en ServletName, sino que ya estoy en ServletContext como un todo. Parece que el problema está en el contenedor de servlets ... ¿Tal vez un problema de OSX con GWT? – Juri

Cuestiones relacionadas