我在PhaseListener中添加了faces-config.xml:

<lifecycle>
    <phase-listener>com.project.NotificationListener</phase-listener>
</lifecycle>

该类似乎很正确,因为它非常简单。
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,这很可能是不正确的,并且也无法使注入(inject)工作。

有没有办法在PhaseListener中注入(inject)CDI管理的bean?

最佳答案

在JSF 2.2之前,PhaseListener尚未注册为CDI注入(inject)目标。使用@Inject(和@EJB)实际上对PhaseListener没有影响。您需要通过以编程方式评估引用@Named的(隐式)名称的EL表达式来手动获取CDI托管的bean,或者最后通过JNDI和BeanManager笨拙地完成。

因此,如果您不能升级到JSF 2.2(应该与任何与JSF 2.0/2.1和Servlet 3.0兼容的Web应用程序兼容),那么最好的选择就是以编程方式评估引用@Named名称的EL表达式。假设您有一个

@Named("stuff")
public class MyCDIStuff {}

然后应该这样做:
FacesContext context = event.getFacesContext();
MyCDIStuff stuff = context.getApplication().evaluateExpressionGet(context, "#{stuff}", MyCDIStuff.class);
// ...

关于jsf - 如何@Inject在PhaseListener中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19930241/

10-09 16:39