2010-07-30 60 views
37

我得到这些消息:JSF支持bean应该是可序列化的?

[#| 2010-07-30T11:28:32.723 + 0000 |警告| glassfish3.0.1 | javax.faces | _ThreadID = 37; _ThreadName =线程1; |设置 非序列属性值到 视图地图:(重点:MyBackingBean,价值 类: foo.bar.org.jsf.MyBackingBean)|#]

做这些的意思是,我的JSF支持豆应实现Serializable?还是他们提到其他一些问题?

回答

58

是的,你理解正确。该视图基本上存储在会话范围内。会话范围在Servlet的HttpSession支持的JSF中。所有会话属性应该实现Serializable,这是因为平均servlet容器可以将会话数据持久存储到硬盘中,以便能够与集群中的其他服务器共享,或承受繁重的负载,或在服务器重新启动期间恢复会话。

只有当相应的类实现Serializable时,才能将原始Java对象存储在硬盘上。然后可以使用ObjectOutputStream将它们写入硬盘,并使用ObjectInputStream从硬盘读取它们。 servletcontainer完全透明地管理这个,你实际上不需要担心它。 JSF只是发出警告,以便你了解风险。

+0

我的豆主要是视图作用域。当会话持续时,它们是否还会持续? – egbokul 2010-07-30 15:05:49

+3

如上所述,视图存储在会话中。 – BalusC 2010-07-30 15:06:16

+0

对不起,再次重新阅读您的答案;-) – egbokul 2010-07-30 15:06:37

0

使用会话,应用程序或会话作用域的bean必须是可序列化的,但使用请求作用域的bean不必是可序列化的。 来源:https://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

+0

重要说明:该部分是关于CDI托管的bean,而不是JSF托管的bean。 – BalusC 2015-06-22 12:19:12

+1

您能否详细说明您的答案,并添加关于您提供的解决方案的更多描述? – abarisone 2015-06-22 12:32:43

-2

是, 支持bean /托管Bean基本上意味着坚持视图状态,所以应该实现系列化,但UI组件可能不会允许它序列化和JSF Runitime会告诉你errror/警告信息。 你可以做的一件事是在MBean中标记这样的组件瞬态。

谢谢。

+1

这不适用于请求或应用程序范围的JSF受管Bean。对于UI组件,您应该永远不要在比请求范围更广泛的范围内将UI组件分配为托管bean的实例变量。这样做只是糟糕的设计。另见a.o. http://stackoverflow.com/questions/14911158/ – BalusC 2015-06-22 14:38:31

相关问题