我们刚刚切换到 Glassfish V2。我们现在在设置 session 属性时遇到错误。
错误是:
java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute
代码是:
getRequest().getSession().setAttribute("questionsForUser", getQuestions());
getQuestions() 只是一个简单的 getter,它位于名为“Parent Action”的抽象类中....所以要使 getQuestions() 成为一个序列化对象,我的类是否需要实现可序列化?:
public List getQuestions() {
return questions;
}
- 我们如何制作这个对象 可序列化?
- 只放 session 中的序列化对象(如 Glassfish 似乎需要)?
- session 是否存在风险 在序列化的用户之间交换 对象?
编辑:我正在使用 ORM (iBatis)
关于“问题”的更多信息
二传手:
public void setQuestions(List questions) {
this.questions = questions;
}
setter 在这个方法中被调用。此方法调用 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());
}
最佳答案
您可以通过使用可序列化列表实现并确保列表中的对象也是可序列化的来使对象可序列化。
是的——最好只将可序列化的对象放入 session 中,因为这将允许您的应用程序在具有多个节点的服务器上运行。即使你现在不关心这个,它在将来可能会有用。
servlet 容器应该确保 session 不会在用户之间交换。使存储在 session 中的对象可序列化允许容器在集群中的多个节点上“分发” session 状态,从而允许拥有 session 的用户请求由任何节点提供服务。
关于java - 设置属性 : Non-serializable attribute (Java Object Serialization),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662348/