【发布时间】:2019-06-24 23:17:01
【问题描述】:
我想将@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 方法中为空。
【问题讨论】:
-
我认为这不是一个重复的问题。我询问了 JSF 2.3 中的注入,而不是 JSF 2.2 中的注入。我的目标是消除所有通过 EL 表达式从上下文中获取 bean 的代码。
-
你试过现场注入吗?
-
在stackoverflow.com/questions/19930241/… BalusC 建议它应该从 JSF 2.2 开始工作,但我也无法使用 fieldinjection 将
@Inject某些东西放入 Phaselistener(使用 openWebbeans、Mojarra 2.3、CDI API 2.0) .撤销了我的重复标志并对解决方案感兴趣。因此投了赞成票。 -
@BravoNine 最好将您的答案放入回复中,并将其标记为已接受以帮助他人;)
标签: jsf cdi weld jsf-2.3 phaselistener