3

我想使用一个支持组件作为一个层来访问我的复合组件的属性(在其接口中定义)。我想要实现的是通过我的支持组件类读取我的组件的属性,我在其中返回所提供属性的属性值。

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 组件的属性。

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

4

1 回答 1

5

UIComponent#getAttributes()是一张很特别的地图。在给定的键上,比如说"foo",它首先评估#{component.foo}ValueExpression隐式调用UIComponent#getFoo()方法的 a 。另请参阅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}" />
于 2013-08-20T14:32:53.930 回答