【发布时间】:2011-05-10 08:21:31
【问题描述】:
我正在使用 primefaces 和 web 2.0 做 j2ee 目前卡在这里并出现此错误
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)
一些谷歌搜索说我需要实现我在这个函数中使用的所有类的可序列化。但我已经这样做了。这个错误似乎很普遍,我无法弄清楚。并且不真正理解下面的错误
org.apache.derby.client.am.PreparedStatement40
【问题讨论】:
-
您尝试序列化的类是否具有非瞬态 PreparedStatement 成员变量?
-
是的。我应该将 PrepareStatement 声明为暂时的,对吗?似乎一切都好,现在问题解决了。谢谢
-
获取
PreparedStatement(或Connection或ResultSet作为实例变量是一个非常糟糕的主意。您的问题比仅此异常更大。正常的JDBC习语要求Connection、Statement和ResultSet等 DB 资源应在尽可能短的范围内打开和关闭。即在与您使用它们的位置完全相同的方法块中。跨度> -
我同意 BalusC - 将 PreparedStatements 保留为成员变量通常是一个奇怪的决定。在单个方法调用中创建、使用和处置它们更为常见。
-
@BalusC:我也犯了类似的错误,你的评论救了我。 非常感谢!。我试图在 viewMap 中保留 DB(cassandra) 查询的
ResultSet并且出现了同样的问题。顺便说一句,这有什么不好的?是否应该将ResultSet数据复制到自制实例变量(对于我的情况是哈希图),然后放入 JSF viewMap 中? (当用户从同一视图回帖时,我需要这些数据来管理用户在网页上的操作。)