我正在将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;
}
}
步骤如下:
page
,调用方法bean.onNavToPage
; bean.item
设置为bean.inputHidden
值; 此时不会调用命令链接,因为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?
提前感谢您的帮助。