首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何@注入PhaseListener

如何@注入PhaseListener
EN

Stack Overflow用户
提问于 2013-11-12 13:16:20
回答 2查看 5.1K关注 0票数 9

我在faces-config.xml中添加了一个faces-config.xml

代码语言:javascript
复制
<lifecycle>
    <phase-listener>com.project.NotificationListener</phase-listener>
</lifecycle>

这个类似乎在其他方面是正确的,因为它非常简单。

代码语言:javascript
复制
public class NotificationListener implements PhaseListener {

    @Inject
    private MyCDIStuff stuff;

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        this.stuff.doStuff();
    }
}

“beforePhase”方法被正确调用,但是MyCDIStuff对象为null。我尝试对类使用注释@Singleton,这很可能是不正确的,而且它也无法使注入工作。

有没有办法在PhaseListener中注入CDI托管bean?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-12 13:23:13

在JSF2.2之前,PhaseListener没有注册为CDI注入目标。使用@Inject (和@EJB)实际上对PhaseListener没有任何影响。您需要通过编程方式计算引用@Named(隐式)名称的EL表达式,或者通过JNDI和BeanManager (相当笨拙)作为最后手段来手动获取CDI托管bean。

因此,如果您不能升级到JSF2.2(应该与任何JSF2.0/2.1和Servlet3.0兼容的web应用程序兼容),那么最好的方法是编程地评估引用@Named名称的EL表达式。假设你有一个

代码语言:javascript
复制
@Named("stuff")
public class MyCDIStuff {}

那么,这应该可以做到:

代码语言:javascript
复制
FacesContext context = event.getFacesContext();
MyCDIStuff stuff = context.getApplication().evaluateExpressionGet(context, "#{stuff}", MyCDIStuff.class);
// ...
票数 14
EN

Stack Overflow用户

发布于 2013-11-12 15:29:05

如果不能使用JSF2.2,最好的选择是使用Deltaspike。

它提供MyCDIStuff myCDIStuff = BeanProvider.getContextualReference(MyCDIStuff.class, false);

德尔塔斯派克是你应该得到的东西,而不是自己发明的。例如,如果您必须拥有BeanManager (例如,触发一个事件),那么Deltaspike也提供了BeanManagerProvider

http://deltaspike.apache.org/core.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19930241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档