我正在开发一个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/

10-09 01:59