JSF支持组件 - 组合组件 - Stackoverflow异常

时间:2013-08-20 13:59:14

标签: jsf jsf-2 composite-component

我想使用支持组件作为访问我的复合组件属性的层(在其界面中定义)。 我想要实现的是通过我的支持组件类读取我的组件的属性,其中我给出了提供的属性的属性值。

public String getName() {
    if (this.name == null) {
        this.name = getAttributes().get("name");
    }

    return this.name;
}

但是在设置新值时,例如通过输入字段,我想将值存储在我的支持bean属性中,而不是将作为属性参数传递的原始属性的值更新到我的复合组件。

public void setName(final String name) {
    this.name = name;
}

我现在的问题是,当我第一次调用我的支持组件的getter时,或者在他生命的某个早期阶段,如上所示,getter的代码导致了一个Stackoverflow异常,因为getAttributes.get(“name”)调用我的支持组件(本身)的getter取而代之的是获取提供给我的复合组件的属性/属性。 有趣的部分是使用一个简单的getter只返回this.name而不是调用getAttributes()我可以在那里设置一个断点然后调用getAttributes.get(“name”)(通过调试器)结果不是溢出/调用它自己的getter但是而是返回提供给我的复合组件的属性。

我想这与背衬组件和复合组件之间的耦合有关。当第一次调用getter时,没有给出它们之间的耦合,因此getAttributes.get(“name”)的调用导致调用我的后备组件的getter,而后来调用不会调用它自己的getter而是获取提供给我的comp组件的属性。

任何人都知道如何解决这个问题? Thnx提前。

1 个答案:

答案 0 :(得分:5)

UIComponent#getAttributes()是一张非常特别的地图。在给定的密钥上,例如"foo",它首先将#{component.foo}评估为ValueExpression,隐式调用UIComponent#getFoo()方法。另见the javadoc。这完全解释了无限循环。如果getFoo()方法不存在,那么它只是继续查看“静态”地图(您可以通过覆盖UIComponent#getValueExpression()来控制)。

您需要以不同方式解决您的具体功能要求。我实际上很难绕过你的具体功能需求,但我相信你实际上需要用单独的getter / setter定义单独的属性,所有这些都适当地委托给状态助手:

public String getLocalName() {
    return getStateHelper().eval("localName", getAttributes().get("name")); // Note: this thus defaults to #{cc.attrs.name} when not set before.
}

public void setLocalName(String localName) {
    return getStateHelper().put("localName", localName);
}

然后在复合实现中将其用作

<h:inputText value="#{cc.localName}" />

而不是

<h:inputText value="#{cc.attrs.name}" />