2009-11-02 405 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
  • 只有具有也序列化