当我将无状态Bean注入有状态Bean时会发生什么?

时间:2018-05-07 12:12:41

标签: java jsf javabeans seam

我在一个大型的单片Java Web系统上工作,使用JSF 1.1和Seam Framework构建,在jBoss服务器上运行。

我有一个JSF Backing Bean(默认情况下在JSF中有状态),它注入一个用作服务的无状态Bean(并使用@Stateless注释)。无状态服务有一个实例成员变量,声明为List,并通过方法增加。

问题: 将jBoss版本从5.1 EAP更新为7.0后,提到的变量(列表)将从其他请求中获取值。这会在系统中创建一个错误。但是,变量是在无状态服务中。为什么会这样?在这种情况下应该发生什么?

ps:我有很多东西可以用来解决问题,但我需要了解发生了什么。

编辑:Pproblem解决了,我几年来一直在使用jBoss 5和Seam Framework。我对一个错误的jBoss 5 comportament感到困惑。在阅读了Steteless Bean的定义之后,我完全理解我的代码是什么: [Java EE 1.4教程1

更新到jBoss 7之后,无状态bean池按预期工作,系统代码提供了一个错误,因为我的团队执行不好(无状态bean有这么多全局变量)。当jBoss池开始工作时,值开始与其他请求共享。

1 个答案:

答案 0 :(得分:1)

这是因为您的无状态实例在多个有状态实例之间共享。

无状态bean的成员变量在运行时几乎表现为全局变量。所以: - 如果您的列表取决于某个州,请将其放入有状态的bean中 - 否则保持原样但使用吹扫机制 - 第三种无国籍状态"有状态的状态"但只有在Web服务器中才包含使用ThreadLocal变量