我在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/