提交rich:数据表,列为h:selectOneRadio

时间:2014-01-19 19:26:54

标签: richfaces jsf-1.2

在过去的3天里,我一直试图让以下工作。 我有一个数据表,它从一个支持bean获取数据,并显示一个带有3个单选按钮的列。页面按预期呈现,单选按钮获得正确的值。 然而,提交表格并不符合预期。每当我提交表单时,相应对象的值都将设置为表中最后一个对象的值。 奇怪的是,当我查看通过Fiddler发送的表单时,正在发送正确的值而不是复制最后一行中对象的值。我猜测selectOneRadio id与之有关,但为id设置动态值会导致错误。

提前致谢,如果需要更多信息,请告知我们。

<rich:dataTable id="facilities_organisation"
                var="orgFacility"
                value="#{organisationFacilitiesHandler.findAllFacilitiesForCurrentOrganisation}">
    <rich:column>
        <f:facet name="header">
            <h:outputText value="Naam" />
        </f:facet>
        <h:outputText value="#{orgFacility.facility.name}" />
    </rich:column>
    <rich:column>
        <f:facet name="header">
            <h:outputText value="Beschikbaar?" />
        </f:facet>
        <h:selectOneRadio id="facility" value="#{orgFacility.availabilityType.id}">
            <f:selectItems value="#{organisationFacilitiesHandler.findAllAvailabilityTypes}" />
        </h:selectOneRadio>
    </rich:column>
</rich:dataTable>

Backbean

private Organisation activeOrganisation = null;
private List<OrganisationFacility> facilities = new ArrayList<OrganisationFacility>();

public Organisation getActiveOrganisation() {
    return this.activeOrganisation;
}
public void setActiveOrganisation(Organisation organisation) {
    activeOrganisation = organisation;
}

public List<OrganisationFacility> getFindAllFacilitiesForCurrentOrganisation() {
    this.facilities = new ArrayList<OrganisationFacility>();
    if (this.activeOrganisation != null) {
        //Error handling omitted
        this.facilities = facilityManager.findAllFacilitiesForOrganisation(this.activeOrganisation);
    }
    return this.facilities;
}
public void setFindAllFacilitiesForCurrentOrganisation(List<OrganisationFacility> facilities) {
    //This function doesn't ever seem to get called...
    LOG.debug("setFindAllFacilitiesForCurrentOrganisation was called");
}

public List<SelectItem> getFindAllAvailabilityTypes() {
    List<SelectItem> selectItems = new ArrayList<SelectItem>();

    //Error handling omitted
    List<AvailabilityType> types = this.facilityManager.findAllAvailabilityTypes();
    for (AvailabilityType t : types)
        selectItems.add(new SelectItem(t.getId(), t.getLabel() + (t.getName().equals("specific") ? " opleiding" : "")));

    return selectItems;
}

public String save() {
    AvailabilityType defaultType = facilityManager.defaultAvailabilityType();
    if (defaultType == null)
        return "showOrganisation";

    for (Iterator<OrganisationFacility> it = this.facilities.iterator(); it.hasNext(); ) {
        OrganisationFacility f = it.next();

        //Business code omitted for readability
        //At this point every f.AvailabilityType has already been duplicated from the last object in the datatable
    }

    return "showOrganisation";
}

1 个答案:

答案 0 :(得分:0)

我刚刚找到了自己的答案。 它可能不是最佳或完全符合通常的处理方式,所以请随时提出我的问题的解决方案。

这条线似乎是罪魁祸首:

<h:selectOneRadio id="facility" value="#{orgFacility.availabilityType.id}">

似乎嵌套属性未按预期处理。 我通过更改“getFindAllFacilitiesForCurrentOrganisation”方法来解决问题,以返回没有任何嵌套属性的简化对象列表。相反,它们只包含必要的ID,我稍后在“保存”方法中使用它来执行实际更新。所以现在它看起来像这样:

<h:selectOneRadio id="facility" value="#{orgFacility.typeId}">