无法在JSF 2.1应用程序中引用PhaseListener中的ViewScoped Managed bean

时间:2012-10-05 12:49:12

标签: jsf-2 managed-bean phaselistener

我尝试了几十个谷歌搜索的每个解决方案: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);

没有任何作用!!!

1 个答案:

答案 0 :(得分:2)

对于请求映射方法,它失败,因为视图范围bean未存储在请求范围中。它存储在视图范围中。至于其他方法,它们会失败,因为视图范围bean存储在视图中,因此只有在视图恢复后才能使用。但是,您正在尝试在视图恢复之前获取它。这是一个鸡蛋问题。

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

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