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

xst*_*ing 3 jsf composite-component jsf-2

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

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

    return this.name;
}
Run Code Online (Sandbox Code Playgroud)

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

public void setName(final String name) {
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bal*_*usC 5

UIComponent#getAttributes()是一张非常特别的地图.例如,在给定的键上,"foo"它首先计算#{component.foo}ValueExpression隐式调用UIComponent#getFoo()方法的键.另见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);
}
Run Code Online (Sandbox Code Playgroud)

然后在复合实现中使用它

<h:inputText value="#{cc.localName}" />
Run Code Online (Sandbox Code Playgroud)

代替

<h:inputText value="#{cc.attrs.name}" />
Run Code Online (Sandbox Code Playgroud)