【问题标题】:Failing to set a default value to the composite component未能为复合组件设置默认值
【发布时间】:2015-04-25 00:18:31
【问题描述】:

我有一个List<String>,我成功地在数据表中表示它;现在我正在尝试用它创建一个复合组件,但我似乎一直无法理解 StateHelper 的工作原理。

我想要做的是,如果 xhtml 传递的value 属性评估为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) 是 @ 987654337@,而我希望它不为空,因为在组件首次呈现时已对其进行了初始化。我希望getStateHelper 在调用之间携带这种状态,我错在哪里?。

哦!我在 JDK 7 中使用 Wildfly 8.1(无升级)。

【问题讨论】:

    标签: jsf-2 jsf-2.2 composite-component


    【解决方案1】:

    深入挖掘,我发现了一些错误的证据,所以I reported it。我会更新答案,看看这是否真的是一个错误或我的一些重大误解。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多