2012-02-10 41 views
0

當我部署我的web應用,我看到java.io.NotSerializableException:org.apache.catalina.session.StandardSessionFacade

com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException 
SEVERE: Error Rendering View[/qtl.xhtml] 
java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
at java.util.HashMap.writeObject(HashMap.java:1001) 
... 

我研究周圍,這個錯誤可能是因爲我試圖序列屬性此錯誤消息那是不可序列化的。所以我有一個ApplicationScoped託管Bean,它看起來像下面

@ManagedBean 
@ApplicationScoped 
public class ApplicationBean implements Serializable { 

    private Map<String, HttpSession> logins; 
    ... 
} 

Map<String, HttpSession> logins可序列化的?

的Tomcat 7

+0

地圖通常是可序列化的,但看起來像會話實現(org.apache.catalina.session.StandardSessionFacade)不是。無論如何,我無法想象它是以這種方式序列化會話的好主意。 – Perception 2012-02-10 18:53:22

+0

檢查了這一點: http://www.ibm.com/developerworks/websphere/library/bestpractices/httpsession_performance_serialization.html – alfasin 2012-02-10 19:12:07

+0

@Perception:我需要知道與我的服務器上的特定'userId'關聯的'HttpSession',所以當我從數據庫中刪除它們時,我可以通過它們的'userId'獲得它們的'HttpSession',並使它們的連接失效。有一個更好的方法嗎? – 2012-02-10 19:12:24

回答

4

HttpSession確實不序列化。畢竟,應用程序範圍的bean也不應該是可序列化的。從應用程序範圍的bean類中刪除implements Serializable,不要將其注入爲會話或視圖範圍的bean的託管屬性。而是將其注入到請求範圍的bean中,或者從應用程序映射中獲取它。

+0

對不起,需要一段時間回覆給你。由於我沒有將我的ApplicationScoped bean注入到我的SessionScoped bean中,現在我的ApplicationScoped bean甚至沒有加載。有沒有辦法告訴我的ApplicationScoped bean首先加載,BalusC? – 2012-02-10 20:29:11

+1

設置'@ManagedBean(eager = true)'(或者將整個事物改爲'@ WebListener',而不是實現'ServletContextListener')。 – BalusC 2012-02-10 20:30:42

+0

謝謝BalusC。這似乎工作。 – 2012-02-10 20:55:47