0

我正在将 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>

豆子如下:

@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. 显示页面后,按下命令链接。

此时没有调用命令链接,因为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?

在此先感谢您的帮助。

4

0 回答 0