gpt4 book ai didi

java - 设置属性 : Non-serializable attribute (Java Object Serialization)

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:39 25 4
gpt4 key购买 nike

我们刚刚切换到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com