2016-03-15 51 views
0

当试图将文件上载到在Java 8/Jetty 9 Compatible Managed VM环境中运行的Google App Engine应用程序时,我得到以下堆栈跟踪,因为org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart类不执行java.io.Serializable接口。使用Java 8/Jetty 9 Compat App Engine环境的java.io.NotSerializableException

我得到以下异常:

[INFO] java.io.NotSerializableException: org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
[INFO] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
[INFO] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 
[INFO] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
[INFO] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
[INFO] at java.util.HashMap.internalWriteEntries(HashMap.java:1777) 
[INFO] at java.util.HashMap.writeObject(HashMap.java:1354) 
[INFO] at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) 
[INFO] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[INFO] at java.lang.reflect.Method.invoke(Method.java:498) 
[INFO] at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028) 
[INFO] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 
[INFO] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
[INFO] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
[INFO] at java.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333) 
[INFO] at java.util.HashMap.writeObject(HashMap.java:1354) 
[INFO] at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) 
[INFO] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[INFO] at java.lang.reflect.Method.invoke(Method.java:498) 
[INFO] at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028) 
[INFO] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 
[INFO] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
[INFO] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
[INFO] at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441) 
[INFO] at java.util.Collections$SynchronizedMap.writeObject(Collections.java:2691) 
[INFO] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[INFO] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
[INFO] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[INFO] at java.lang.reflect.Method.invoke(Method.java:498) 
[INFO] at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028) 
[INFO] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 
[INFO] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
[INFO] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
[INFO] at java.util.HashMap.internalWriteEntries(HashMap.java:1777) 
[INFO] at java.util.HashMap.writeObject(HashMap.java:1354) 
[INFO] at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) 
[INFO] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[INFO] at java.lang.reflect.Method.invoke(Method.java:498) 
[INFO] at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028) 
[INFO] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 
[INFO] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 
[INFO] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
[INFO] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
[INFO] at com.google.apphosting.runtime.SessionManagerUtil.serialize(SessionManagerUtil.java:28) 
[INFO] at com.google.apphosting.runtime.DatastoreSessionStore.createEntityForSession(DatastoreSessionStore.java:73) 
[INFO] at com.google.apphosting.runtime.DatastoreSessionStore.saveSession(DatastoreSessionStore.java:112) 
[INFO] at com.google.apphosting.runtime.jetty9.SessionManager$AppEngineSession.save(SessionManager.java:145) 
[INFO] at com.google.apphosting.runtime.jetty9.SaveSessionFilter.doFilter(SaveSessionFilter.java:43) 
[INFO] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
[INFO] at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
[INFO] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
[INFO] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 
[INFO] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
[INFO] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:553) 
[INFO] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
[INFO] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 
[INFO] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
[INFO] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
[INFO] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 
[INFO] at com.google.apphosting.vmruntime.jetty9.VmRuntimeWebAppContext.doScope(VmRuntimeWebAppContext.java:299) 
[INFO] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
[INFO] at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 
[INFO] at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) 
[INFO] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
[INFO] at org.eclipse.jetty.server.Server.handle(Server.java:497) 
[INFO] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 
[INFO] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 
[INFO] at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
[INFO] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 
[INFO] at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 
[INFO] at java.lang.Thread.run(Thread.java:745) 

回答

1

正如你看到的有:

[INFO] at com.google.apphosting.runtime.SessionManagerUtil.serialize(SessionManagerUtil.java:28) 
[INFO] at com.google.apphosting.runtime.DatastoreSessionStore.createEntityForSession(DatastoreSessionStore.java:73) 
[INFO] at com.google.apphosting.runtime.DatastoreSessionStore.saveSession(DatastoreSessionStore.java:112) 
[INFO] at com.google.apphosting.runtime.jetty9.SessionManager$AppEngineSession.save(SessionManager.java:145) 
[INFO] at com.google.apphosting.runtime.jetty9.SaveSessionFilter.doFilter(SaveSessionFilter.java:43) 

服务器正在试图把MultiPartInputStreamParser到用户会话(并保存到数据库)。你不应该那样做。

+0

我的歉意。 我知道问题出现的原因 - App Engine运行时将所有会话变量放入数据存储区。 我不认为这是_unreasonable_假设javax.servlet.http.Part _不应该被存储在内存中。我有一个托管bean,它是'@ ViewScoped',所以只要客户端正在访问页面,bean的内容就会保留在内存_中。 –

+0

每个应用程序引擎实例都是无状态的。为了使状态必须与集群中的每个其他实例共享状态,因此与用户状态/会话相关的所有内容都必须存储在数据库中。基本上你不应该在应用程序引擎上保留任何内容,它不会以这种方式工作 –

+0

Google App Engine框架在'appengine-web中提供'<会话启用>真实'属性设置.xml'配置文件。 javax.servlet.http.Part是Servlet API的一个标准方面,JSF 2.2框架最终提供了一个''标签。 App Engine平台非常棒,我发布这个问题的主要原因是为了确保那些试图做同样事情的人能够找到解决方案。最终,答案应该包含一个可行的解决方法,这将允许某人在App Engine应用程序上使用'h:inputFile' JSF标记。 –

相关问题