У меня есть 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.