我正在将 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;
}
}
步骤如下:
- 导航到页面调用
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?
在此先感谢您的帮助。