JSF后台bean应该是可序列化的吗?

40
我收到了这些信息:

[#|2010-07-30T11:28:32.723+0000|WARNING|glassfish3.0.1|javax.faces|_ThreadID=37;_ThreadName=Thread-1;|将非可序列化属性值设置为ViewMap:(key: MyBackingBean,value class:foo.bar.org.jsf.MyBackingBean)|#]

这些信息的意思是我的JSF后备bean是否应该实现Serializable接口?还是指向其他问题?
3个回答

65

是的,你理解的没错。视图基本上存储在会话范围内。JSF中的会话作用域由Servlet的HttpSession支持。所有会话属性都应该实现Serializable,因为平均的servlet容器可能将会话数据持久化到硬盘等地方,以便与集群中的其他服务器共享,或者在重负载下存活,或者在服务器重新启动期间恢复会话。

如果相应的类实现了Serializable,就可以将原始Java对象存储在硬盘上。然后可以使用ObjectOutputStream将它们写入硬盘,使用ObjectInputStream从硬盘读取它们。Servlet容器会自动透明地管理所有这些内容,实际上你不需要担心它。JSF只是发出警告,以便你了解风险。


我的Bean大多数是视图作用域。当会话持久化时,它们也会被持久化吗? - egbokul
4
如所述,视图被存储在会话中。 - BalusC
1
@BalusC,您的JSF、JavaEE答案非常有价值。 - Sree Rama
@BalusC,我们应该只序列化视图bean还是视图和会话bean?那请求和应用程序bean呢? - Mahmoud Saleh
像EJB这样的注入资源怎么办?当ViewScoped Bean被恢复时,它们会被重新注入吗?在这种情况下,它们应该标记为“瞬态”吗? - Aleksandr Erokhin
2
@AlexErohin:EJB被注入为可序列化代理。这里不需要更改任何内容。还可以参考https://dev59.com/QV8e5IYBdhLWcg3wpLwr。 - BalusC

0

重要提示:该部分是关于CDI管理的Bean,而不是JSF管理的Bean。 - BalusC
1
您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone

-2

是的,Backing Beans / Managed Beans 基本上用于持久化视图状态,因此应该实现序列化,但 UI 组件可能不允许序列化,并且 JSF 运行时会显示错误/警告消息。你可以在 MBeans 中将这样的组件标记为瞬态。

谢谢。


1
这不适用于请求或应用程序范围的JSF托管bean。至于UI组件,您绝对不应该将UI组件分配为管理bean的实例变量,其范围比请求范围更广。这样做只是糟糕的设计。另请参阅https://dev59.com/PGUp5IYBdhLWcg3w-LQJ。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接