0

我正在使用 struts2、hibernate 和 spring 并使用模型驱动模式。尝试同时准确地获取具有 2 个不同用户和会话(也是不同计算机)的对象时,似乎存在一个严重的问题。

更多信息...假设我们有一个 Project 对象,它有 2 个成员 - 用户和名称。两个用户都将尝试获取他们的项目对象(当然,对于不同的用户来说,这是一个不同的对象)。因此,用户 A 将拥有一个 ID 为 498 的项目,而用户 B 将拥有一个 ID 为 499 的项目。

struts 操作将识别出他们正在尝试获取具有不同 ID 的对象,但似乎两个用户都具有相同的 Project 对象实例,因此他们看到相同的结果。您可以在此处提供的日志中看到:

2011-12-08 14:07:21 LoginInterceptor [INFO] 用户 17 正在调用 populateProject,参数:id=499 2011-12-08 14:07:21 LoginInterceptor [INFO] 用户 4 正在调用 populateProject,参数: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, Session User Id 为 4, obj.user.id 为 4

我该如何解决?

谢谢,罗恩。

4

1 回答 1

3

根据我们的讨论,我正在发布问题的原因和解决方案。没有为 spring 插件创建的操作设置范围,默认情况下它们的范围为singleton. 在 struts2 中,每个动作也作为域对象工作,因此 Struts2 总是为每个请求创建一个动作的新实例并将其放在值堆栈上。

在上述情况下,范围是singleton并且是问题的原因,因为两个用户都有相同的动作对象由于singleton scope.Settingscope=prototype解决的问题而被弹簧传递

有关更多详细信息,请参阅官方插件页面

Struts2-Spring 插件

于 2011-12-08T15:08:48.323 回答