我们有JSF,Spring和Hibernate / JPA。
假设我们有一个搜索表单,我们想要根据许多输入进行搜索,并且响应应该返回到表格并显示到网格。
因此,我们向服务器发送了一些输入并等待响应以显示给用户。
问题出在:
当我打开2个浏览器并转到同一个表单时,我用一些输入填充我的两个表单,我的网格将显示不正确的结果。
错误的结果意味着:
表单1 :(输入: lineId = 10 ,结果(预期):包含 lineId = 10 的行;)
表单2 :(输入: lineId = 20 ,结果(预期):包含 lineId = 20 的行);
但是,当我同时单击两个表单上的按钮来调用我的表单(控制器)的操作时,结果是:
表单1 :(输入: lineId = 10 ,结果:包含 lineId = 20 的行);
表单2 :(输入: lineId = 20 ,结果:包含 lineId = 10 的行);
我的表格范围是:请求
我的服务范围是:singleton
我的表单有一个调用按钮操作的方法,此方法将输入发送到我的服务,并在从我的服务给出响应后,再次将其发送到表单以进行表示(非常常见的行为)。
我应该说这种情况发生在并发调用操作中,当我单击我的按钮未同步时,一切正常。!!
有什么问题?发生了什么事?
答案 0 :(得分:0)
正如我在您的问题中的评论中所述,然后由您发现,问题是由于单个bean具有非单一字段,该字段同时由两个(或多个)线程修改。
如果你正在使用单例bean,bean必须不能保持状态,最多可能有静态字段和/或引用另一个spring单例bean的字段。
任何人都知道为什么当我将范围改为原型时,这个问题没有像我们预期的那样解决
即使将顶级spring bean作为原型处理,持有该字段的bean也是单例,因此即使在创建原型bean的新实例时,所有这些实例都包含对同一个单例bean的引用。如果你想要一个spring bean来处理状态,必须是原型。此外,如果您的bean是原型,那么将使用它的所有bean 必须也是原型,否则Spring将在创建新的实例时创建一个新的原型bean 它(单身豆不会发生)。
请注意,此问题与JSF 无关,与Spring配置完全相关。