我有一个简单的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
即使抛出此异常,项目也会部署并正确运行!
可能出现什么问题?
答案 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)