JSF复合不会使用StateHelper

时间:2017-07-06 13:46:25

标签: java jsf primefaces jsf-2 composite

我正在开发一个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将它存储在视图范围中。但无论我尝试什么,如果我点击带有void / null结果的命令链接,getMyModel()方法总是返回null。 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在后台组件中实现restoreState()方法并设置断点会显示问题。 调用postAddToView之前处理。使用restoreState()代替我解决了这个问题。