我尝试了几十个谷歌搜索的每个解决方案: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);
没有任何作用!!!
答案 0 :(得分:2)
对于请求映射方法,它失败,因为视图范围bean未存储在请求范围中。它存储在视图范围中。至于其他方法,它们会失败,因为视图范围bean存储在视图中,因此只有在视图恢复后才能使用。但是,您正在尝试在视图恢复之前获取它。这是一个鸡蛋问题。
您需要修改自己的方法。也许bean需要成为一个请求范围?也许逻辑需要在不同的阶段执行?也许逻辑需要在bean本身中执行?等
由于您认为这是正确解决方案的具体功能要求未在问题中提及,我无法指出您正确的方向。