2015-02-23 9 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> 

боб компонент

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

Проблема, которую я обнаружил, заключается в том, что при прохождении data2 (список null) нажатие кнопки добавляет новый элемент, но только первые два раза; после этого, независимо от того, сколько раз я нажимаю кнопку, новые элементы не добавляются в список (исключение не отображается в журнале). Напротив, нет проблем с добавлением как можно большего количества элементов, которые я хотел бы инициализировать компонентом с помощью data1.

Одна вещь, которую я заметил, что приводит меня к мысли, что я неправомерно используется getStateHelper является то, что, когда я нажимаю кнопку, метод init() выполняется дважды, в то время, this.getStateHelper().get(LISTA_DATOS) является null, в то время как я ожидал не быть нулевым из-за того, что он инициализировался при первом представлении компонента. Я ожидал, что getStateHelper нести такое состояние между вызовами, где я ошибаюсь?

Oh! Я использую Wildfly 8.1 (без апгрейдов) с JDK 7.

ответ

0

Копаем глубже, я обнаружил некоторые признаки ошибки, поэтому I reported it. Я обновлю ответ, чтобы узнать, действительно ли это ошибка или какое-то большое заблуждение от меня.