java.io.NotSerializableException:org.primefaces.model.DefaultStreamedContent

时间:2014-10-10 22:18:26

标签: jsf primefaces jsf-2.2

我有一个简单的jsf 2.1,它曾经使用primefaces 3.4在Java EE 6上正常工作。

当我迁移到glassfish 4.0和primefaces 5.1时,我每次在Netbeans上重新部署项目时都会遇到以下异常:

  

java.io.NotSerializableException:org.primefaces.model.DefaultStreamedContent

     

java.io.NotSerializableException:org.primefaces.component.datatable.DataTable

即使抛出此异常,项目也会部署并正确运行!

可能出现什么问题?

2 个答案:

答案 0 :(得分:5)

您已将这些类型声明为视图或会话范围的托管bean的属性。你绝对不应该这样做。您应该将它们声明为请求范围bean的属性。

视图和会话范围的bean必须是Serializable,因为视图范围bean在同一会话中的同一视图上的多个请求之间重用/共享,并且会话范围bean在同一会话中的多个请求之间重用/共享。绑定到特定HTTP会话的任何内容都必须是Serializable,因为它使服务器能够在磁盘上存储会话,因此可以在群集中的其他服务器之间共享,或者在服务器重新启动后继续运行。

DefaultStreamedContent(以及它正在包装的InputStream(如果有的话)可能绝对不会被创建并被指定为视图/会话范围的bean属性,不仅因为它不可序列化,而且因为它只能读一次。您只需要在getter方法中创建它。这确实是一个相当特殊的案例,在这个答案中进一步充实:Display dynamic image from database with p:graphicImage and StreamedContent

DataTable是一个JSF组件,您最有可能通过binding属性引用它。它绝对不能被指定为视图/会话范围的bean属性,因为UI组件本身就是请求作用域。在同一会话中跨多个恢复的视图重用相同的UI组件实例可能导致其状态在多个请求(因此不是线程安全!)和/或潜在的“重复组件ID”错误之间共享。另见a.o. How does the 'binding' attribute work in JSF? When and how should it be used?

答案 1 :(得分:0)

当类的实例必须实现Serializable接口时,抛出

NotSerializableException

如果抛出异常的类不属于第三方库,请找到该类并使其实现可序列化接口。

如果您不想序列化类中的对象,可以将对象标记为transient,以使可序列化运行时忽略对象。

您可以阅读here