Session serialization problem in Google AppEngine

I’m trying to run a simple QuickTickets-like Vaadin 7.1.3 app on GAE. It runs fine locally but after I deploy it to Google and authenticate every link is broken with a NotSerializableException like below. My servlet is serializable and extends GAEVaadinServlet. Looking at GAEVaadinServlet.java:260 it appears to be failing to serialize the VaadinSession. The only thing I put into the session is a simple serializable User bean. Any thoughts?


com.vaadin.server.GAEVaadinServlet service: Not serializable!
java.io.NotSerializableException: com.google.apphosting.runtime.security.UserClassLoader
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1197)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:455)
	at com.vaadin.event.ListenerMethod.writeObject(ListenerMethod.java:88)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1497)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:363)
	at java.util.HashSet.writeObject(HashSet.java:284)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1497)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1545)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:363)
	at com.vaadin.server.GAEVaadinServlet.service(GAEVaadinServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
	at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
	at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:439)
	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
	at java.lang.Thread.run(Thread.java:722)

I have narrowed the problem fields down to the EventRouter and LegacyCommunicationManager in the VaadinSession. Both of these end up having references to the unserializable UserClassLoader but I can’t figure out how to avoid that.

Thanks in advance for any help!

any updates on this? did you solve the problem? I am in similar trouble.

Please try with the latest 7.1.x version first - there were some serious GAE issues with early 7.1.x versions.

If that does not help, the problem could be related e.g. to the (direct or indirect) Class<?> references in ListenerMethod and in LegacyCommunicationManager. If you can still reproduce the problem with a minimal application, you could
create a ticket
about the issue with the application as an attachment.

Does anybody solved this issue?

Sasi