3

我想在我的实现中注入一个@SessionScoped和一个@RequestScopedbean PhaseListener,但我得到了NullPointerException.

我使用带有焊接实现的tomcat来实现CDI。我开始将 JSF 2.2 迁移到 2.3,所以我从FacesContext. 好吧,我替换@ManagedBean了 to@Named以及迁移期间必须做的任何其他事情,例如: - 将 bean XML 添加到每个模块 - 将 BeanManager 添加到上下文 XML - 从 faces-config.xml 删除 bean 声明 - 将 SPIBeanManager作为 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方法中为空。

4

2 回答 2

1
  1. 我将 CDI 配置文件beans.xml放入文件夹META-INF而不是WEB-INF
  2. beans.xml我不得不将bean-discovery-mode从“注释”更改为“全部”。
  3. 我忘了添加一个带@FacesConfig(version = Version.JSF_2_3)注释的类(为 CDI bean 启用 EL 解析)。
  4. 也忘记将faces-config.xml版本更改为 2.3
于 2019-03-14T16:46:40.080 回答
0

幸运的是我解决了这个问题......我必须做的一些事情:

  1. 我将 beans.xml 放入 META-INF/,但 beans.xml 必须在 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。
于 2019-02-04T13:59:25.393 回答