2011-01-20 127 views
2

我在Seam中注入组件时遇到了很多麻烦。component.getInstance()在Seam中返回新实例

当某个用户在我的应用程序中执行某些操作时,我希望将一个事件传播给当前登录的其他许多用户(接收该事件的用户将由导致事件触发的用户决定)。

我接触到这个的方法是在Application范围内创建一个对象,其中的HashMap故事是针对用户标识的有状态会话bean。

当事件被触发时,应用程序作用域对象中的观察者方法运行并调用hashmap中的每个bean的方法(作为参数传递一个实体bean)。

在每个bean调用的方法中,我需要访问一些注入的方法来验证“bean的用户”是否应该对该事件作出反应(通过显示实体bean中的一些数据)。为了做到这一点,我需要访问一些注入的bean(SFSB和无状态bean),但是现在它们都是空的。

我的理解是Component.getInstance()(包装在Lifecycle.beginCall()/ .endCall()块)或其中一个类似的方法可以用于检索对象,但这不起作用。

如果我要做类似(StoryManagerAction)的Component.getInstance(“storyManagerAction”),其中storyManagerAction是一个有状态会话bean,我期望StoryManagerAction的一个名为storyManagerAction的实例当前驻留在会话中。但是,我得到了一个StoryManagerAction的实例,其所有基元成员都设置为0,并且其所有对象成员都设置为空。

任何想法为什么发生这种情况,我需要做什么才能正常工作?

+0

是否每个用户都在其会话上下文中始终有一个`StoryManagerAction`组件,或者它们是否在特定的时间点创建? – kraftan 2011-01-21 12:08:31

回答

1

当您迭代Map并调用每个StoryManagerAction上的方法时,注入的内容与引发该事件的会话范围有关,而不是该bean所属的会话范围。

避免注入StoryManagerAction并解决@Create带注释的方法中所有需要的bean,您将在其中将值保存在常规实例变量中。