Hic*_*ham -1 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
即使抛出此异常,项目也将正确部署并运行!
有什么事吗
您已将这些类型声明为视图或会话范围的托管Bean的属性。您绝对不应该这样做。您应该将它们声明为请求范围的bean的属性。
视图和会话范围的Bean必须是Serializable因为视图范围的Bean在同一会话中的同一视图上的多个请求之间的重用/共享,并且会话范围的Bean在同一会话中的多个请求之间的重用/共享。与特定HTTP会话相关联的任何事物都必须为Serializable,因为它使服务器能够将会话存储在磁盘上,因此可以在集群中的其他服务器之间共享它,或者在服务器重新启动后生存下来。
在DefaultStreamedContent(和InputStream它是包装,如果有的话)可能绝对不会被创建和分配作为视图/会话范围的bean属性,不仅是因为它不是序列化的,而且还因为它只能读取一次。您只需要在getter方法中创建它。这确实是一个非常特殊的情况,在以下答案中将进一步充实:使用p:graphicImage和StreamedContent显示来自数据库的动态图像
这DataTable是您最有可能通过binding属性引用的JSF组件。可能绝对不会将其分配为视图/会话范围的bean属性,因为UI组件本质上是请求范围的。在同一会话中的多个已还原视图之间重用同一UI组件实例可能会导致其状态在多个请求之间共享(因此不是线程安全的!)和/或潜在的“重复组件ID”错误。另请参见ao “绑定”属性在JSF中如何工作?什么时候以及如何使用?
| 归档时间: |
|
| 查看次数: |
3283 次 |
| 最近记录: |