我有一个带有视图范围的托管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).........
但是当我将范围更改为会话或请求时,一切正常。 任何人都可以告诉我,如果我做错了什么?也许我忘记了配置或什么?
答案 0 :(得分:5)
您已将JDBC Connection
指定为视图作用域托管bean的属性。查看作用域的托管bean及其所有属性需要可序列化,因为它们将存储在会话中。但是Connection
接口不会扩展Serializable
,因此会出现此异常。您需要将其设为transient
。
但真正的问题实际上更大;将外部资源作为一个类的领域是一个非常糟糕的主意。您永远不应该将DB资源保存为类的字段,该类的字段比资源需要保持打开的时间更长。否则它们将泄漏和/或将导致线程安全和事务性问题(死锁等)和/或将由DB回收并因此停止工作。
您应始终打开和关闭最短范围内的连接(以及语句和结果集),最好是在同一方法块的try-finally
块内。如果要提高连接性能,则应使用连接池。