2013-08-20 48 views
3

我想使用備份組件作爲訪問我的複合組件的屬性(如其界面中定義的)的層。 我想實現的是通過我的支持組件類讀取我的組件的屬性,其中我提供了所提供屬性的屬性值。JSF備份組件 - 複合組件 - Stackoverflow異常

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; 
} 

我現在的問題是,當我的支持組件的吸氣劑被稱爲第一時間或在他的生活,吸氣的代碼的某些早期上面出現StackOverflow例外,因爲getAttributes.get(效果如圖所示」名稱「)調用我的支持組件(本身)的getter,而不是獲取提供給我的複合組件的屬性/屬性。 有趣的部分是使用一個簡單的getter只返回this.name而不是調用getAttributes()我可以在那裏設置一個斷點,然後調用getAttributes.get(「name」)(通過調試器)結果不在溢出/調用它自己的getter而是返回提供給我的複合組件的屬性。

我想這與背部部件和複合部件之間的耦合有關。當第一次調用getter時,不會給出它們之間的耦合,因此getAttributes.get(「name」)的調用將導致調用我的支持組件的getter,而之後調用不會調用它自己的getter,而是獲取提供給我的comp組件的屬性。

任何人有任何想法如何解決這個問題? Thnx提前。

+0

怎麼樣的getAttributes()的代碼,你可以分享嗎?它是否在同一個後臺bean中? – cheffe

+0

@cheffe:它只是從'UIComponent'類繼承而來。 xstring,我冒昧地從問題中移除了[java]和[ejb]'標籤,因爲這個問題根本與這個問題無關,只會吸引上面的無用評論。 – BalusC

+0

好的,謝謝BalsuC。 – xstring

回答

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

thx很多fot你的幫助BalusC。我的功能要求是在最後按下「保存」按鈕之後,首先更新提供給我的壓縮組件的原始屬性。在此之前,我需要處理該屬性的副本以不更新我的模型。希望這個解決方案合理嗎?或者你有更好的解決方案來滿足這個特定的功能需求? – xstring

+0

好的,那麼上面的答案確實適用。然而,你應該將保存按鈕的動作綁定到像'action =「#{cc.save}」''這樣的支持組件,並且通過它們的getter來收集本地值,然後像'getAttributes()。put(「名稱「,getLocalName());'。 – BalusC

+0

現在感謝您的幫助,並感謝您爲其他人提供的其他答案。很多尊重你的工作。當我正確的時候你也是Primefaces背後的人之一,我們在這裏使用了很多... – xstring