gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:41:36 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

您需要以不同的方式解决具体的功能需求。实际上,我很难理解您的具体功能要求,但我相信您实际上需要使用单独的 getter/setter 定义单独的属性,所有这些都正确委托(delegate)给状态助手:

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}" />

关于JSF 支持组件 - 复合组件 - Stackoverflow 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com