我正在使用struts2,hibernate和spring以及使用模型驱动模式。在尝试同时获取具有2个不同用户和会话(也是不同计算机)的对象时,似乎存在严重问题。
更多信息...... 假设我们有一个Project对象,它有2个成员 - 用户和名字。 两个用户都将尝试获取他们的Project对象(当然,这是不同用户的不同对象)。因此,用户A将拥有ID为498的项目,而用户B将拥有ID为499的项目。
struts操作会识别出他们正在尝试获取具有不同ID的对象,但似乎两个用户都具有相同的Project对象实例,因此他们看到相同的结果。 您可以在此处提供的日志中看到:
2011-12-08 14:07:21 LoginInterceptor [INFO]用户17正在调用populateProject,params:id = 499 2011-12-08 14:07:21 LoginInterceptor [INFO]用户4正在调用populateProject,params:id = 498 2011-12-08 14:07:21 ProjectAction [INFO] Obj:hbn.Project@e2df60d,会话用户ID为17,obj.user.id为4 2011-12-08 14:07:21 ProjectAction [INFO] Obj:hbn.Project@e2df60d,会话用户ID为4,obj.user.id为4
我怎么解决?
谢谢, 罗恩。
答案 0 :(得分:3)
根据讨论,我发布了问题和解决方案的原因。
没有为spring插件创建的操作设置范围,默认情况下它们的范围为singleton
。
在struts2中,每个操作也可以作为域对象使用,因此Struts2总是为每个请求创建一个新的操作实例,并将其置于值堆栈中。
在上面的案例范围是singleton
,这是问题的原因,因为由于singleton scope
两个用户都有春天传递的相同操作对象。设置scope=prototype
已解决的问题
有关详细信息,请参阅官方插件页面