2009-11-02 407 views
5

我們只是切換到Glassfish V2。我們現在在設置會話屬性時會出錯。setAttribute:不可序列化的屬性(Java對象序列化)

錯誤是:

java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute 

代碼是:

getRequest().getSession().setAttribute("questionsForUser", getQuestions()); 

getQuestions()僅僅是一個簡單的getter這是一個名爲 '家長行動' 的抽象類中....所以使getQuestions()一個序列化對象做我的課需要實現序列化的?:

public List getQuestions() { 
    return questions; 
} 
  • 我們如何才能使這個對象 可序列化?
  • 這是一個很好的做法,只將 序列化的對象在會話中(因爲Glassfish似乎需要 )?
  • 會話有 交換在用戶序列化 對象之間的風險嗎?

編輯:我使用的ORM(iBatis的)

更多信息有關 「問題」

二傳手:

public void setQuestions(List questions) { 
    this.questions = questions; 
} 

設置器調用此方法中。此方法調用iBatis映射。

public void prepareQuestions() 
{   
setExamIfaceDAO((SecurityExamIfaceDAO)ApplicationInitializer.getApplicationContext().getBean("securityExamIfaceDAO")); 
    String userRole = questionsBasedOnUserRole(); 
    int questionsToBeShown = 0; 
    if (userRole.equalsIgnoreCase("C")) 
     questionsToBeShown = 15; 
    else if (userRole.equalsIgnoreCase("U")) 
     questionsToBeShown = 10; 
    List local_questions = getExamIfaceDAO().getSecurityQuestions(userRole); 
    Collections.shuffle(local_questions); 
    if (local_questions.size()>=questionsToBeShown) 
     setQuestions(local_questions.subList(0, questionsToBeShown)); 
    getRequest().getSession().setAttribute("questionsForUser", getQuestions()); 
} 
+0

對於有類似問題的人非靜態非瞬態字段:當你在列表上做一個子列表時,你可以找回沒有實現Serializable的RandomAccessList。所以解決方案是將所有內容添加到像ArrayList這樣的搜索列表中。 – Omnipresent 2009-11-02 21:51:49

回答

9

可以通過使用可序列化的List實現使對象可序列化,並確保列表中的對象也可序列化。

是的 - 最好的做法是隻將可序列化對象放入會話中,因爲這樣可以讓您的應用程序在具有多個節點的服務器上運行。即使您目前不關心此事,將來也可能有用。

servlet容器應該確保會話不會在用戶之間交換。使存儲在會話中的對象可串行化允許容器將會話狀態「分佈」到羣集中的多個節點上,從而允許擁有該會話的用戶請求任何節點提供服務的請求。

2

它要求他們可序列化,因爲Servlet規範說,他們要如果「分配」標籤是在web.xml中。該規範假定servlet引擎將使用序列化跨服務複製會話。

使其成爲可序列化的唯一方法是...使用可序列化的List實現!您必須編寫自己的自定義List類,因爲我知道JDK中的所有實現都是可序列化的。無論是該對象還是列表中的對象都不可序列化。

或者,如果您不關心會話是否跨多臺服務器複製,您可以刪除「可分發」。

+0

大聲笑... def沒有寫我自己的自定義列表類... – Omnipresent 2009-11-02 16:45:56

+0

也許您的列表中的對象不可序列化,然後.. – 2009-11-02 16:47:04

+0

「問題」從哪裏來?你在使用ORM嗎?許多ORM(如Hibernate)引入了自己的Collection實現。您可能需要解開您的問題並將其包裝到正常的ArrayList中。請同時發佈Question類的類定義。 – mhaller 2009-11-02 16:50:05

0

List包含哪些類型的對象?即列表的通用類型是什麼?它是列表<字符串>或列表<問題>其中問題是一個本土的javabean類嗎?如果後者是這種情況,則需要讓它執行java.io.Serializable。這基本上都是。 javabean規範也要求您這樣做。

0

如果所有的JDK集合的元素都是可序列化的,則它們都是可序列化的。我的猜測是其列表元素不可序列化,而不是List對象本身。到(過)簡化,對於對象是可序列化,必須:

  • 實現Serializable
  • 只有具有也序列化