我有一个非常奇怪的情况。我正在研究一个有很多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并且仍然维护其他字段似乎不对。
提前致谢
答案 0 :(得分:0)
似乎在您应用程序的其他位置,某些代码正在修改List
(因为您说它不是null
而是空的 - 如果它是null
我希望它完全被代码的其他部分从上下文中删除了)。也许在将List
放到上下文之后,某些代码仍会维护引用并对其进行操作?
您可以尝试执行以下操作:
request.getSession().setAttribute(Constants.SESSION_LIST_SEARCH, Collections.unmodifiableList(beanList));