2009-09-28 12 views
5

Obecnie eksperymentuję z GWT i wiosną. Dokładniej chciałem, aby próbka GreetingService działała ze Springem po stronie serwera. Istnieje kilka artykułów dostępne dla realizacji tego (mam łącząc je tutaj, ponieważ niektórzy z was mogą być zainteresowani):GWT + Spring: Wyjątek NullPointerException dla funkcji getServletContext()

Teraz następuje wspomniane instrukcje i podczas uruchamiania wszystkiego w trybie hostowanym GWT, usługa po stronie serwera jest również wywoływana z powodzeniem. Ale zanim odpowiedź zostanie odesłana do klienta, otrzymuję wyjątek NullPointerException, gdy metoda getServletContext() jest wywoływana wewnętrznie przez pewną wiosenną klasę szkieletową. StackTrace jest następujący:

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) 

Oto lista bibliotekami wdrożyć na moim serwerze/GWT gospodarzem katalogu Mode:

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 

Nawet więcej info:
rozwijający na Mac OSX, Java w wersji 1.6 .0_15.

Czy ktoś ma pojęcia, co może być problemem?

Thx dużo.

Odpowiedz

4

Właśnie znalazłem problem. Implementacja GWTController musi być uświadomiona w kontekście Servlet. Można tego dokonać poprzez implementację interfejsu ServletContextAware i nadpisanie metod pozwalających na wstrzyknięcie kontekstu.

Po prostu published a blog post, która opisuje problem i przedstawia rozwiązanie bardziej szczegółowo.

0

Mamy podobny problem i stwierdziliśmy, że pole private transient ServletConfig config na javax.servlet.GenericServlet było puste. GWT's RemoteServiceServlet dzwoniło pod numer , który z kolei nazywał się getServletName(), który NPE z powodu config jest pusty.

Nasze rozwiązanie było 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(); 
} 

Można było dowiedzieć się, dlaczego ServletConfig nie jest ustawiony lub zastąpić niektóre metody jak my.

+0

thx za podpowiedź, ale wygląda na to, że mój problem jest jeszcze gorszy. Nie mam tylko NPE w ServletName, ale już w ServletContext jako całości. Wydaje się, że problem tkwi w kontenerze serwletów ... Może problem z OSX z GWT? – Juri