First, I want to say that I'm really impressed with Lift. It's a
pleasure to work with (now that I've figured it out) and it keeps
getting better.

I'm working on a Lift project that runs on Google App Engine. After an
extended period of development on a local dev server, I uploaded my
app and was surprised to discover it didn't work in the App Engine
environment anymore.

In the logs, I discovered that every request resulted in a HTTP 500
error. The root cause appeared to be a ClassNotFoundException thrown
by com.google.apphosting.runtime.security.UserClassLoader while
deserializing a net.liftweb.http.SessionToServletBridge. (Or possibly
some object that contains a SessionToServletBridge?)

I found an entry in the Google App Engine issue tracker noting
problems with the deserialization of certain objects from a Session:

http://code.google.com/p/googleappengine/issues/detail?id=1290

Some of the comments suggest that these objects are running afoul of
App Engine's JRE White List:

http://code.google.com/appengine/docs/java/jrewhitelist.html

But I looked at the source for SessionToServletBridge and did not see
any forbidden classes in the imports, so I'm not sure if that's the
problem in this case.

I was able get my app working again by reverting from the snapshot to
version 1.1-M4, so presumably, the change that's causing the problem
was introduced after the M4 milestone.

I don't know if compatibility with App Engine is a priority for the
Lift team, but if this doesn't get fixed, I face an ugly choice
between remaining frozen at 1.1-M4 as Lift development moves forward,
or migrating away from App Engine to another cloud solution. Is there
anything I can do to assist the diagnosis/resolution of this issue?

Thanks,
Mark

Here's the stack trace:

javax.servlet.ServletException: java.lang.RuntimeException:
java.lang.ClassNotFoundException:
net.liftweb.http.SessionToServletBridge
        at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle
(AppVersionHandlerMap.java:239)
        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.headerComplete
(HttpConnection.java:830)
        at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable
(RpcRequestParser.java:76)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
        at
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest
(JettyServletEngineAdapter.java:139)
        at com.google.apphosting.runtime.JavaRuntime.handleRequest
(JavaRuntime.java:235)
        at com.google.apphosting.base.RuntimePb$EvaluationRuntime
$6.handleBlockingRequest(RuntimePb.java:4823)
        at com.google.apphosting.base.RuntimePb$EvaluationRuntime
$6.handleBlockingRequest(RuntimePb.java:4821)
        at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest
(BlockingApplicationHandler.java:24)
        at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:
359)
        at com.google.net.rpc.impl.Server$2.run(Server.java:820)
        at com.google.tracing.LocalTraceSpanRunnable.run
(LocalTraceSpanRunnable.java:56)
        at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan
(LocalTraceSpanBuilder.java:516)
        at com.google.net.rpc.impl.Server.startRpc(Server.java:775)
        at com.google.net.rpc.impl.Server.processRequest(Server.java:348)
        at com.google.net.rpc.impl.ServerConnection.messageReceived
(ServerConnection.java:436)
        at com.google.net.rpc.impl.RpcConnection.parseMessages
(RpcConnection.java:319)
        at com.google.net.rpc.impl.RpcConnection.dataReceived
(RpcConnection.java:290)
        at com.google.net.async.Connection.handleReadEvent(Connection.java:
428)
        at com.google.net.async.EventDispatcher.processNetworkEvents
(EventDispatcher.java:762)
        at com.google.net.async.EventDispatcher.internalLoop
(EventDispatcher.java:207)
        at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:
101)
        at com.google.net.rpc.RpcService.runUntilServerShutdown
(RpcService.java:251)
        at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run
(JavaRuntime.java:374)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException:
java.lang.ClassNotFoundException:
net.liftweb.http.SessionToServletBridge
        at com.google.apphosting.runtime.jetty.SessionManager.deserialize
(SessionManager.java:362)
        at com.google.apphosting.runtime.jetty.SessionManager.loadSession
(SessionManager.java:280)
        at com.google.apphosting.runtime.jetty.SessionManager.getSession
(SessionManager.java:255)
        at org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession
(AbstractSessionManager.java:237)
        at org.mortbay.jetty.Request.getSession(Request.java:998)
        at org.mortbay.jetty.servlet.SessionHandler.handle
(SessionHandler.java:192)
        at org.mortbay.jetty.handler.ContextHandler.handle
(ContextHandler.java:712)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
405)
        at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle
(AppVersionHandlerMap.java:237)
        ... 27 more
Caused by: java.lang.ClassNotFoundException:
net.liftweb.http.SessionToServletBridge
        at com.google.apphosting.runtime.security.UserClassLoader$1.run
(UserClassLoader.java:352)
        at com.google.apphosting.runtime.security.UserClassLoader$1.run
(UserClassLoader.java:347)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.google.apphosting.runtime.security.UserClassLoader.findClass
(UserClassLoader.java:347)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at
com.google.apphosting.runtime.security.UserClassLoader.loadClassImpl
(UserClassLoader.java:434)
        at com.google.apphosting.runtime.security.UserClassLoader.loadClass
(UserClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at com.google.apphosting.runtime.jetty.SessionManager
$DelegatingObjectInputStream.resolveClass(SessionManager.java:415)
        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at java.util.HashMap.readObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
        at java.io.ObjectInputStream.readSerialData(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
        at java.io.ObjectInputStream.readSerialData(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at com.google.apphosting.runtime.jetty.SessionManager.deserialize
(SessionManager.java:358)
        ... 35 more

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to