【问题标题】:Cannot reference ViewScoped Managed bean from PhaseListener in JSF 2.1 app无法从 JSF 2.1 应用程序中的 PhaseListener 引用 ViewScoped Managed bean
【发布时间】:2012-09-26 15:09:04
【问题描述】:

我已经尝试了几十个谷歌搜索中的每一个解决方案:getRequestMap、ElResolver、evaluateExpressionGet 等等。没有,绝对没有,工作。我每次都收到null。以下是相关代码:

    @ManagedBean(name="readerBean")
    @ViewScoped
    public class ReaderBean implements Serializable {...

在 PhaseListener 中:

     public void beforePhase(PhaseEvent event) {

    if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {

            ReaderBean r = null; //The Managed Bean
            try {
                FacesContext fctx = FacesContext.getCurrentInstance();
                r=(ReaderBean) fctx.getExternalContext().getRequestMap().get("readerBean");
                r=(ReaderBean) fctx.getELContext().getELResolver().getValue(fctx.getELContext(), null, "readerBean");
                r=(ReaderBean) fctx.getApplication().getExpressionFactory().createValueExpression(fctx.getELContext(), "#{readerBean}", ReaderBean.class).getValue(fctx.getELContext());
                r=(ReaderBean) fctx.getApplication().evaluateExpressionGet(fctx, "#{readerBean}", ReaderBean.class);

没有用!!!

【问题讨论】:

  • 呃...我感觉这与我试图在还原视图的 beforePhase 中运行此代码有关。
  • 确实,我在 3 秒前已经详细解释过了。

标签: jsf-2 managed-bean phaselistener


【解决方案1】:

对于请求映射方法,它失败了,因为视图范围的 bean 没有存储在请求范围中。相反,它存储在视图范围内。至于其他方法,它们失败了,因为视图范围的 bean 存储在视图中,因此只有在视图恢复后可用。但是,您试图在视图恢复之前获取它。这是一个先有鸡还是先有蛋的问题。

您需要修改您的方法。也许 bean 需要是一个请求范围的?也许逻辑需要在不同的阶段执行?也许逻辑需要在 bean 本身中执行?等等。

由于问题中未提及您认为这是正确解决方案的具体功能要求,因此我无法为您指明正确的方向。

【讨论】:

  • 是的,我将代码放入 RESTORE_VIEW 的 afterPhase 方法中,一切正常。功能要求只是为了响应自定义 ajax 调用而从 phaseListener 获取对视图范围的托管 bean (readerBean) 的引用。
猜你喜欢
  • 2016-12-25
  • 2010-11-19
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多