组件绑定返回null值

时间:2013-07-23 15:36:51

标签: jsf-2

我正在将JSF 1.2应用程序迁移到JSF 2.1,特别是我目前正在使用mojorra 2.1.24。
该应用程序由请求范围的bean组成,为了在请求之间传递数据,它将数据嵌入UI组件中 以下行为适用于JSF 1.2,但不适用于JSF 2.1。

该页面包含以下代码段:

<h:form prependId="false">
    <h:inputHidden binding="#{bean.inputHidden}" />
    ...
    <h:panelGroup rendered="#{bean.rendered}">  
        ...
        <h:commandLink value="onAction" action="#{bean.onAction}" />
    </h:panelGroup>
</h:form>

bean如下:

@ManagedBean
@RequestScoped
public class Bean {

  private UIInput inputHidden;

  private AItem item;

  public setInputHidden(UIInput inputHidden){
      this.inputHidden = inputHidden;

      if(item != null){
         this.inputHidden.setValue(item);
      }   

  }

 public AItem getItem(){
   return (AItem) getInputHidden().getValue();
 }

  // other getter/setter



 public String onNavToPage(AItem item){
     this.item = item;
     return "page";
 }

 public String onAction(){
    //... do something
    return "";
 }

 public boolean isRendered(){
    return getProcessItem() != null;
 }

}

步骤如下:

  1. 导航到页面page,调用方法bean.onNavToPage;
  2. 在页面呈现时,bean.item设置为bean.inputHidden值;
  3. 在页面显示后,
  4. 按下命令链接。
  5. 此时不会调用命令链接,因为bean.inputHidden.getValue()返回null,并且不处理命令链接。 我注意到在恢复视图阶段传递给setInputHidden方法的inputHidden参数有,inputHidden.getValue()== null,之前在视图中没有保存任何值。 我猜想组件状态管理中发生了一些变化,但是调试JSF代码我没找到。

    调试JSF代码我发现组件状态在视图中保存状态之前已被屏蔽,因此ComponentStateHelper.saveState()保存deltaMap而不是defaultMap,其中已放置所有状态。

    public Object saveState(FacesContext context) {
        if (context == null) {
            throw new NullPointerException();
        }
        if(component.initialStateMarked()) {
            return saveMap(context, deltaMap);
        }
        else {
            return saveMap(context, defaultMap);
        }
    }
    

    这是一个错误吗? 如果没有,我该如何恢复JSF 1.2行为并保存defaultMap?

    提前感谢您的帮助。

0 个答案:

没有答案