当使用JSF 2.3,tomcat和焊接cdi实现时,是否可以将bean注入phaselistener?

问题描述 投票:2回答:1

我想在我的@SessionScoped实现中注入@RequestScopedPhaseListener 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是无效的。

jsf cdi weld jsf-2.3 phaselistener
1个回答
1
投票
  1. 我将CDI配置文件beans.xml放入文件夹META-INF而不是WEB-INF
  2. beans.xml,我不得不将bean-discovery-mode从“annotated”更改为“all”。
  3. 我忘了添加一个带有@FacesConfig(version = Version.JSF_2_3)注释的类(为CDI bean启用EL解析)。
  4. 也忘记将faces-config.xml版本更改为2.3
© www.soinside.com 2019 - 2024. All rights reserved.