2010-07-30 17 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