我想将一个 @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。

请您参考如下方法:

  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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!