【问题标题】:java.io.NotSerializableExceptionjava.io.NotSerializableException
【发布时间】: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(或ConnectionResultSet作为实例变量是一个非常糟糕的主意。您的问题比仅此异常更大。正常的JDBC习语要求ConnectionStatementResultSet 等 DB 资源应在尽可能短的范围内打开和关闭。即在与您使用它们的位置完全相同的方法块中。跨度>
  • 我同意 BalusC - 将 PreparedStatements 保留为成员变量通常是一个奇怪的决定。在单个方法调用中创建、使用和处置它们更为常见。
  • @BalusC:我也犯了类似的错误,你的评论救了我。 非常感谢!。我试图在 viewMap 中保留 DB(cassandra) 查询的ResultSet 并且出现了同样的问题。顺便说一句,这有什么不好的?是否应该将 ResultSet 数据复制到自制实例变量(对于我的情况是哈希图),然后放入 JSF viewMap 中? (当用户从​​同一视图回帖时,我需要这些数据来管理用户在网页上的操作。)

标签: java jsf


【解决方案1】:

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

【讨论】:

  • 我应该将preparestatement设置为临时的。以前不知道瞬态。我也确实把它搬到了别的地方。两种解决方案都可以正常工作。非常感谢
【解决方案2】:

问题是您尝试序列化的对象引用了 org.apache.derby.client.am.PreparedStatement40,或者很可能引用了 java.sql.Statement,这是该类实现的接口。 您必须删除该引用才能使其正常工作

【讨论】:

    【解决方案3】:

    线索在这里:

    StateManagerImpl.writeState
    

    您可能在其中一个组件上设置了不合适的值。您可能需要在支持 bean 中显式调用 setValue 的地方使用 EL 绑定(根据发布的信息我的最佳猜测)。

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

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2013-07-11
      • 2013-01-03
      • 2013-09-13
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多