我正在开发一个JSF复合材料,该复合材料将复杂的数据结构作为参数:
<cc:interface componentType="MyComponent">
<cc:attribute name="myModel" required="true" type="my.package.Model" />
</cc:interface>
支持组件使用init()方法处理该模型,该方法通过事件在组合中调用:
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
[...]
</cc:implementation>
在这个init()方法中,我检查模型是否已经处理过(因为我不想每次用户停留在页面上时都这样做,例如通过ajax请求)。因此,我通过StateHelper.put()存储处理后的模型:
public void init()
{
if (getMyModel() == null)
{
MyModel model = processModel(...);
setMyModel(model);
}
}
@SuppressWarnings("unchecked")
public MyModel getMyModel()
{
return (MyModel) getStateHelper().get("MyModel");
}
public void setMyModel(MyModel MyModel)
{
getStateHelper().put("MyModel", MyModel);
}
我现在期望,如果例如在Ajax请求(在同一视图范围内)期间调用init()方法,则它不会第二次处理该模型,因为我已通过StateHelper将其存储在视图范围内。但是无论我尝试什么,如果我单击具有无效结果的命令链接,则getMyModel()方法始终返回null。
有任何想法吗?
最佳答案
在支持组件中实现restoreState()
方法并设置断点可以解决此问题。 postAddToView
事件在调用restoreState()
之前进行处理。相反,使用preRenderView
为我解决了该问题。
关于java - JSF Composite不使用StateHelper存储状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44950786/