java.io.NotSerializableException:org.postgresql.jdbc4.Jdbc4Connection

0 java jsf jdbc

我有一个带有视图范围的托管bean.问题是,当我运行Web应用程序时,我有以下错误:

GRAVE: Error Rendering View[/login.xhtml]
java.io.NotSerializableException: org.postgresql.jdbc4.Jdbc4Connection
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source).........
Run Code Online (Sandbox Code Playgroud)

但是当我将范围更改为会话或请求时,一切正常.任何人都可以告诉我,如果我做错了什么?也许我忘记了配置或什么?

Bal*_*usC 5

您已将JDBC指定Connection为视图作用域托管bean的属性.查看作用域的托管bean及其所有属性需要可序列化,因为它们将存储在会话中.Connection然而,接口不会扩展Serializable,因此这个例外.你需要做到这一点transient.

真正的问题实际上更大; 将外部资源作为一个类的领域是一个非常糟糕的主意.您永远不应该将DB资源保存为类的字段,该类的字段比资源需要保持打开的时间更长.否则它们将泄漏和/或将导致线程安全和事务性问题(死锁等)和/或将由DB回收并因此将停止工作.

您应始终在尽可能短的范围内打开和关闭连接(以及语句和结果集),最好try-finally是在同一方法块的块内.如果要提高连接性能,则应使用连接池.

也可以看看: