我想使用支持组件作为访问我的复合组件属性的层(在其界面中定义)。 我想要实现的是通过我的支持组件类读取我的组件的属性,其中我给出了提供的属性的属性值。
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提前。
答案 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}" />