JSF 组合不使用 StateHelper 存储状态

JSF composite does not store state with StateHelper

我正在开发一个 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 的视图范围。但无论我尝试什么,如果我单击命令 link 并产生 void/null 结果,getMyModel() 方法总是 returns 为空。 有什么想法吗?

在支持组件中实现 restoreState() 方法并设置断点揭示了问题。 postAddToView 事件在 调用 restoreState() 之前处理。使用 preRenderView 解决了我的问题。