Java 调用操作并发时响应不正确

Java 调用操作并发时响应不正确,java,spring,jsf,concurrency,Java,Spring,Jsf,Concurrency,好了,伙计们,让我们来看一个奇怪的场景 我们有JSF、Spring和Hibernate/JPA 假设我们有一个搜索表单,我们希望基于许多输入进行搜索,并且响应应返回表单并显示到网格中。 所以,我们向服务器发送了一些输入,并等待响应显示给用户 问题在于: 当我打开2个浏览器,转到同一个表单,并用一些输入填充两个表单时,我的网格将显示不正确的结果 不正确的结果表示: 表格1:(输入:lineId=10,结果(预期):一行包含lineId=10) 表格2:(输入:lineId=20,结果(预期):一行

好了,伙计们,让我们来看一个奇怪的场景

我们有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

我的表单范围是:请求
我的服务范围是:单身

我的表单有一个调用按钮操作的方法,该方法将输入发送到我的服务,在我的服务给出响应后,再次将其发送到表单进行表示(非常常见的行为)

我应该说,这种情况发生在并发调用操作中,当我单击我的按钮取消同步时,一切都正常


怎么了?发生了什么事

正如我在您的问题中的评论中指出的,然后您发现,问题是由于一个单例bean具有一个非单例字段,该字段同时被两个(或更多)线程修改

如果您使用的是单例bean,那么bean不能保持状态,最多可以有静态字段和/或引用另一个spring单例bean的字段

有人知道为什么当我将范围更改为原型时,这个问题没有像我们预期的那样得到解决

即使将顶层springbean作为原型处理,持有该字段的bean也是一个单例bean,因此即使在创建原型bean的新实例时,所有这些都包含对同一个单例bean的引用。如果希望Springbean处理状态,它必须是原型。另外,如果您的bean是prototype,那么将使用它的所有bean也必须是prototype,否则Spring将在创建它的新实例时创建一个新的prototype bean(单例bean不会发生这种情况)


请注意,这个问题与JSF无关,与Spring配置完全相关。

您能展示一些代码吗?在没有看到细节的情况下很难回答您的问题。我认为代码在这里并不重要。简单的jsf、表单和服务!可能是配置问题或是愚蠢的代码,我不知道。但是如果有帮助,我会放一些代码:)我认为这可能只是某种范围问题。您是否导入了正确的@RequestScope?有两个具有此名称的注释。一个用于CDI,一个用于JSF。@chkal即使使用了错误的
@RequestScoped
,bean在默认情况下也是正确类型的
@RequestScoped
。似乎更多的是关于Springbean处理状态的问题,这确实是错误的。这里的代码对于检测错误的位置很重要。请记住,如果您使用的是单例bean,那么bean不能保持状态,即最多可以有
静态
字段和/或引用另一个spring单例bean的字段。