2015-02-23 82 views
0

我有一個List<String>,我成功地將其表示爲一個數據表;現在我正在嘗試創建一個複合組件,但似乎我仍然無法理解StateHelper如何工作。未能將默認值設置爲複合組件

我想要做的是,如果value由xhtml傳遞的屬性計算爲null,自動創建一個新的List<String>。現在,唯一可能的操作是單擊一個按鈕,將新項目添加到列表中。

我的組件

<cc:interface componentType="testComponent"> 
    <cc:attribute name="value" required="true" type="java.util.List"/> 
</cc:interface> 

<cc:implementation> 
    <f:event type="postAddToView" listener="#{cc.init}" /> 
    <p:dataTable id="data" value="#{cc.data}" var="_data"> 
    <p:column headerText="Nombre/Relación"> 
     <h:outputText value="#{_data}" /> 
    </p:column> 
    </p:dataTable> 

    <p:commandButton value="Añadir" process="@this" update="data" 
    actionListener="#{cc.addData}" ajax="true"/> 
</cc:implementation> 

組件bean是

@FacesComponent("testComponent") 
public class TestComponent extends UIOutput implements NamingContainer { 
    private static final String LISTA_DATOS = "LST_DATOS"; 

private static final Logger log = Logger.getLogger(TestComponent.class.getName()); 

@Override 
public String getFamily() { 
    return UINamingContainer.COMPONENT_FAMILY; 
} 

public List<String> getData() { 
    @SuppressWarnings("unchecked") 
    List<String> data = (List<String>) this.getStateHelper().get(LISTA_DATOS); 
    return data; 
} 

public void setData(List<String> data) { 
    this.getStateHelper().put(LISTA_DATOS, data); 
} 

public void addData() { 
    List<String> data = (List<String>)this.getData(); 
    data.add("HOLA"); 
    this.setData(data); 
} 

public void init() { 
    log.info("En init()"); 
    if (this.getStateHelper().get(LISTA_DATOS) == null) { 
    if (this.getValue() == null) { 
     this.getStateHelper().put(LISTA_DATOS, new ArrayList<String>()); 
    } else { 
     this.getStateHelper().put(LISTA_DATOS, this.getValue()); 
    } 
    } 
} 

的組件被稱爲像

<h:form> 
    <imas:editorTest value="#{testBean.data1}"/> 
</h:form> 
<h:form> 
    <imas:editorTest value="#{testBean.data2}"/> 
</h:form> 

testBean之中:

private List<String> data1 = new ArrayList<>(Arrays.asList("ONE", "TWO", "SIXTYNINE")); 
private List<String> data2 = null; 

public List<String> getData1() { 
    return this.data1; 
} 

public void setData1(List<String> data1) { 
    this.data1 = data1; 
} 

public List<String> getData2() { 
    return this.data2; 
} 

public void setData2(List<String> data2) { 
    this.data2 = data2; 
} 

我發現的問題是,當通過data2null列表),點擊按鈕添加一個新的項目,但只有前兩個;之後,無論點擊多少次按鈕,都不會向列表中添加新項目(日誌中未顯示異常)。相反,添加儘可能多的項目沒有問題,因爲我希望用data1初始化組件。我所觀察到的現象,導致我,我濫用getStateHelper的是,當我按一下按鈕,執行兩次init()方法,在當時的思想

一兩件事,this.getStateHelper().get(LISTA_DATOS)null,而我預期由於在組件初次渲染時對其進行了初始化,因此它不爲空。我期望getStateHelper在調用之間攜帶這樣的狀態,我錯在哪裏?

哦!我用JDK 7使用Wildfly 8.1(不升級)。

回答

0

深入挖掘,我發現了一些bug的證據,所以I reported it。我會更新答案,看看它是真的是一個錯誤還是我的一些重大誤解。