a4j:support - 从 h:selectOneMenu 检索到的值始终为 NULL

a4j:support - Value retrieved from h:selectOneMenu is always NULL

有一个数据表,每行有一个 h:selectOneMenu。我希望能够在 bean 的 selectOneMenu 中检索值 selected。我正在使用 richfaces a4j:support 标记对支持 bean 进行 AJAX 调用。您可以看到下面的代码:

数据表header:

<t:dataTable id="datatable" var="row" value="#{myBean.dataTableRows}">

使用 A4j 的 SelectOneMenu:

<h:selectOneMenu id="type" label="Type:" styleClass="tamanho80" 
                                value="#{datatableHolder.selectedValue}" converter="comboConverter" immediate="true" >                           
  <f:selectItem itemValue="#{null}" itemLabel="" />
  <t:selectItems var="tp" 
    itemValue="#{tp}" itemLabel="#{tp.nome}"
        value="#{row.comboTypeValues}"  />
   <f:attribute name="row" value="#{row}"/>                                                         
   <a4j:support event="onchange" reRender="parent" actionListener="${myBean.executeAjax}" immediate="true" ajaxSingle="true" />
</h:selectOneMenu>

要执行的Backing Bean方法:

public void executeAjax(ActionEvent event){

    ValueHolder comboBox = (ValueHolder) event.getComponent().getParent();      
    comboBox .getValue();

}

PS:

此问题已被确定为可能与 重复,但事实并非如此。我的问题使用 dataTable 并且不对每个元素使用绑定。另外,我使用的是 JSF 1.1 和 RichFaces 3.3.3。

已确定问题:

t:selectItems 标签生成的每个 "option" 都带有项目 ID 而不是索引,而 comboConverter 使用 select 项目的索引。因此,该列表有 12 个项目(索引范围应为 0 到 11),但 selected 项目的 id 例如为 22。然后转换器将遍历列表到索引 22 并检索元素。但是这个列表中没有这样的索引,因为最大值是 12 然后转换器总是 return NULL.

这个问题基本上有3种方法可以解决:

  • 创建一个新的转换器,通过它的 id 查找项目
  • Adapt/Change "comboConverter" 通过 id 查找项目(这样做会影响使用此转换器的其他代码段
  • 调整列表以使用索引而不是 ID

我选择了第一个,因为对系统影响较小