我想在我的@SessionScoped
实现中注入@RequestScoped
和PhaseListener
bean,但我得到了NullPointerException
。
我使用tomcat与焊接实现来实现CDI。我开始将JSF 2.2迁移到2.3,所以我从FacesContext
改为CDI。好吧,我将@ManagedBean
替换为@Named
以及在迁移过程中必须做的任何其他事情,例如: - 向每个模块添加bean XML - 将BeanManager添加到上下文XML - 从faces-config.xml删除bean声明 - 将SPI BeanManager
添加为resource-env-ref to web.xml如何将任何bean注入PhaseListener
实现?
@Named
@SessionScoped
public class MyHandler implements Serializable {
..}
@Named
@RequestScoped
public class MyController extends MyParentController<Example> {
..}
public class MyPhaseListener implements PhaseListener {
private MyHandler myHandler;
private MyController myController;
@Inject
public void setMyHandler(MyHandler myHandler) {
this.myHandler= myHandler;
}
@Inject
public void setMyController (MyController myController) {
this.myController= myController;
}
...
public void afterPhase(PhaseEvent event) {
myHandler.method()
}
在myHandler
方法中,afterPhase
注入的bean是无效的。
beans.xml
放入文件夹META-INF
而不是WEB-INF
beans.xml
,我不得不将bean-discovery-mode从“annotated”更改为“all”。@FacesConfig(version = Version.JSF_2_3)
注释的类(为CDI bean启用EL解析)。faces-config.xml
版本更改为2.3