会话属性缺少List

时间:2012-03-22 15:05:10

标签: java spring-mvc arraylist

我有一个非常奇怪的情况。我正在研究一个有很多bug的相当大的Java应用程序,今天我发现了这个。

我会尝试在不发布代码的情况下解释这种情况,因为这些方法太长了,我已经确定并隔离了具体问题。这是:

我在Controller类上设置了会话属性。该属性有几个字段,几个字符串,几个int和某个对象类型的ArrayList。设置如下:

request.getSession().setAttribute(Constants.SESSION_LIST_SEARCH, beanList);

然后还有另一个我需要读取此属性的Controller类,它是这样的:

request.getSession().getAttribute(Constants.SESSION_LIST_SEARCH);

当控制器获取属性(使用正确的强制转换)时,Strings和int字段就在那里,但是ArrayList是空的。

我无法找到答案所以在绝望的行为中,我试图“克隆”列表以查看发生了什么,所以它是这样的:

request.getSession().setAttribute(Constants.SESSION_LIST_SEARCH, beanList);
/* Desperate developer */
ArrayList<ActivityBean> duplicatedList = new ArrayList<ActivityBean>();
for(ActivityBean foo:beanList.getActivityBean()){
    duplicatedList.add(foo);
}
request.getSession().setAttribute("duplicatedList",duplicatedList);

这个解决方法可以解决这个问题(现在我可以正确地从会话中读取bean“duplicatedList”)但是原来的bean在某些点丢失了ArrayList并且仍然维护其他字段似乎不对。

提前致谢

1 个答案:

答案 0 :(得分:0)

似乎在您应用程序的其他位置,某些代码正在修改List(因为您说它不是null而是空的 - 如果它是null我希望它完全被代码的其他部分从上下文中删除了)。也许在将List放到上下文之后,某些代码仍会维护引用并对其进行操作?

您可以尝试执行以下操作:

request.getSession().setAttribute(Constants.SESSION_LIST_SEARCH, Collections.unmodifiableList(beanList));