为什么CDI-Event创建新实例而不是使用现有的Observer?

时间:2012-03-20 20:18:09

标签: jsf-2 initialization cdi

我在JBoss AS 7.1.1上面临CDI问题

我有两个JSF-beas,其中一个有CODI ViewAccessScope(Bean A),它显示所有实体,第二个是普通的RequestScoped(Bean B)。每个Bean都会获得一个所谓的Presenter注入,它可以处理所有的表示逻辑。到目前为止一切都很好。

来自Bean B的Presenter负责创建一个新实体(调用服务... bla ... blubb),当一切都完成后,Bean B重定向到另一个页面但是因为Bean A现在必须重新加载其内容我介绍了JEE-6 Observer

详细信息:两个Beans(A& B)都会注入一个特定的Presenter(通过接口对jsf-bean进行反向)。 Bean-B-Presenter在成功创建实体后触发事件,以便Bean-A-Presenter(Observer)可以重新加载数据并通知Bean-A有关更改。

问题:当观察Presenter(A)重新加载其数据时,我得到NullPointerException,因为对Bean A的引用丢失了。发生这种情况的原因是因为CDI显然正在创建一个新的Presenter对象(用@Named注释),而不是使用与Bean-A结合的对象。

解决方法:当我使用Bean-A作为Observer而不是一切正常时。

我的代码与我添加的链接中的代码非常相似。我不明白为什么在触发事件时会创建一个新实例。

关于LightGuards的

更新评论:

presenter bean只是注释了@Named(默认情况下应该是Dependent-Scope)。

我查看了Weld-Documentatio n,看起来这个范围以某种方式将我的豆子彼此隔离开来。每次视图(jsf-bean)被初始化(所以没有Singletons)时,我需要演示者成为一个新实例。另一方面,我希望能够在它们之间发送事件,这意味着只有已经存在的实例得到通知(而不是创建新实例)。

我刚做了一个测试,主持人是RequestScoped。这不起作用,因为现在在每个HTTP-Request上我得到一个新的Presenter,即使它所属的视图(jsf-bean)是ViewAccessScoped。 SessionScope当然有效......但这会导致错误的设计。

2 个答案:

答案 0 :(得分:1)

听起来你需要为这个用例创建自己的范围。没有默认范围听起来像是符合您的需要。另一个选择是查看MyFaces CODI和他们编写的会话范围。

答案 1 :(得分:0)

请确保您的观察员不是私人的。 而且你必须确保正确地重定向。