2011-05-10 41 views
1

即时通讯做与primefaces和Web 2.0 J2EE,目前与此错误java.io.NotSerializableException

java.io.NotSerializableException: org.apache.derby.client.am.PreparedStatement40 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.writeObject(Unknown Source) 
java.util.HashMap.writeObject(Unknown Source) 
sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
java.lang.reflect.Method.invoke(Unknown Source) 
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.writeArray(Unknown Source) 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.writeObject(Unknown Source) 
java.util.HashMap.writeObject(Unknown Source) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
java.lang.reflect.Method.invoke(Unknown Source) 
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
java.io.ObjectOutputStream.writeObject0(Unknown Source) 
java.io.ObjectOutputStream.writeObject(Unknown Source) 
com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:293) 
com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:167) 
com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:123) 
com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:155) 
com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:221) 
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:397) 
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) 
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) 
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 

一些谷歌上搜索困在这里说,我需要实现Serializable所有类,我在此function.but使用我已经做了that.and这个错误似乎相当普遍的,我不能很明白这out.and真的不明白下面

org.apache.derby.client.am.PreparedStatement40 
+0

您尝试序列化的类是否有非瞬态PreparedStatement成员变量? – DaveH 2011-05-10 08:29:10

+1

yup.i应该声明PrepareStatement是短暂的权利? 似乎现在一切正常 问题已解决。谢谢 – Azuan 2011-05-10 09:53:41

+2

将PreparedStatement(或Connection或ResultSet作为实例变量保存是一个非常糟糕的主意,你的问题比单独的这个异常要大一些。 idiom要求像'Connection','Statement'和'ResultSet'这样的数据库资源应该在最短的可能范围**中打开和关闭,即在与你使用它们的地方相同的方法块中。 – BalusC 2011-05-10 10:57:04

回答

1

看起来您正在将一个(JDBC)PreparedStatement存储在一个正在进行序列化(可能是会话的一部分)的对象中。你应该把它移动到其他地方或者将它标记为瞬态(不要忘记当它恢复时它会丢失)。

+0

我应该把暂时准备作为暂时的。之前不知道瞬态。 并且我确实将它移动到了别的地方。 这两个解决方案工作得很好。 非常感谢 – Azuan 2011-05-10 09:54:58

1

问题的错误是,你正试图序列化对象必须组织一个参考.apache.derby.client.am.PreparedS tatement40,或者最有可能的,到java.sql.Statement,这是类实现的接口。 您必须删除该引用才能使其工作

0

的线索是在这里:

StateManagerImpl.writeState 

很可能你已经在你的组件之一设置不适当的值。您可能需要在后台bean中显式调用setValue的地方使用EL绑定(我根据所发布的信息进行了最佳猜测)。

JSF使用在请求之间持久化的状态化UI组件树。树结构和树上的任何值都保存在渲染响应阶段的末尾。通常,数据保存在会话中或隐藏的表单字段中。因此,组件上设置的任何值都必须是可序列化的。

相关问题