2013-01-06 67 views
6

我有這種的JSF豆類結構:ViewScoped Bean內的SessionScope的ManagedProperty - 瞬態?

@ManagedBean 
@ViewScoped 
public class ViewBeany implements Serializable { 

.... 
    @ManagedProperty(value='#{sessionBeany}) 
    transient private SessionBeany sessionBeany; 
... 

    public getSessionBeany() { ... }; 
    public setSessionBeany(SessionBeany sessionBeany) { ... }; 

} 

的原因transient是會話bean有一些非序列化的成員,無法進行序列化。

這項工作?
如果不是,我該如何解決無法序列化SesionBeany的問題,但必須將其作爲託管屬性保留在視圖範圍的bean下?

謝謝!

+0

如果你沒有這樣的限制,你也可以只設置你的'STATE_SAVING_MODE'到'server'並避免乾脆系列化你查看客戶 – kolossus

回答

12

這不起作用。如果視圖範圍的bean被序列化,則跳過所有transient字段。在反序列化之後,JSF不會重新注入託管屬性,因此最終得到一個視圖範圍的bean,而沒有會話範圍的bean屬性,這隻會導致NPE。

在這個特殊的結構中,最好的辦法是在getter中引入延遲加載,並通過getter而不是直接字段訪問來獲得會話bean。

private transient SessionBeany sessionBeany; 

public SessionBeany getSessionBeany() { // Method can be private. 
    if (sessionBeany == null) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     sessionBeany = context.getApplication().evaluateExpressionGet(context, "#{sessionBeany}", SessionBeany.class); 
    } 

    return sessionBeany; 
} 
+0

感謝。我很驚訝JSF沒有針對這個問題的'精簡'解決方案,因爲我認爲這不是那麼難得。 – Ben

+2

我已經想知道它是不是一個有狀態的EJB。 EJB是作爲可序列化代理注入的,因此您不必擔心序列化。 – BalusC

相關問題