我想将一个 @SessionScoped 和一个 @RequestScoped bean 注入(inject)到我的 PhaseListener 实现中,但是我得到了 NullPointerException.
我使用带有 weld 实现的 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 注入(inject)到 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 注入(inject)的 bean 在 afterPhase 方法中为 null。
请您参考如下方法:
- 我将 CDI 配置文件
beans.xml放入文件夹META-INF而不是WEB-INF - 在
beans.xml中,我必须更改 bean-discovery-mode从“注释”到“全部”。 - 我忘记添加带有
@FacesConfig(version = Version.JSF_2_3)注释的类(以启用 CDI bean 的 EL 解析)。 - 还忘了将
faces-config.xml版本改为2.3




