Vil*_*eva 9 jsf cdi jsf-2 phaselistener
我添加了一个PhaseListener到faces-config.xml:
<lifecycle>
<phase-listener>com.project.NotificationListener</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)
这个类似乎是正确的,因为它非常简单.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
'beforePhase'方法被正确调用,但MyCDIStuff对象为null.我尝试使用@Singleton最可能不正确的类的注释,并且它也没有使注入工作.
有没有办法注入CDI托管bean PhaseListener?
Bal*_*usC 13
在JSF 2.2之前,PhaseListeners未注册为CDI注入目标.使用@Inject(和@EJB)实际上对PhaseListeners 没有影响.您需要通过以编程方式评估引用该@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 {}
Run Code Online (Sandbox Code Playgroud)
那应该这样做:
FacesContext context = event.getFacesContext();
MyCDIStuff stuff = context.getApplication().evaluateExpressionGet(context, "#{stuff}", MyCDIStuff.class);
// ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4496 次 |
| 最近记录: |