在使用带有焊接cdi实现的JSF 2.3,tomcat时,是否可以将bean注入相监听器?

时间:2019-01-31 13:19:34

标签: jsf cdi weld jsf-2.3 phaselistener

我想将@SessionScoped@RequestScoped bean注入我的PhaseListener实现中,但是我得到了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添加到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注入的bean在afterPhase方法中为空。

1 个答案:

答案 0 :(得分:0)

  1. 我将'beans.xml'放入META-INF /中,但是beans.xml必须在WEB-INF下
    1. 在bean xml中,我不得不将bean-discovery-mode从“注释”更改为“全部”。
    2. 我忘记添加带有@FacesConfig(version = Version.JSF_2_3)批注的类(以启用CDI bean的EL分辨率).4。还忘了将faces-config.xml版本更改为2.3