在过去的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";
}
答案 0 :(得分:0)
我刚刚找到了自己的答案。 它可能不是最佳或完全符合通常的处理方式,所以请随时提出我的问题的解决方案。
这条线似乎是罪魁祸首:
<h:selectOneRadio id="facility" value="#{orgFacility.availabilityType.id}">
似乎嵌套属性未按预期处理。 我通过更改“getFindAllFacilitiesForCurrentOrganisation”方法来解决问题,以返回没有任何嵌套属性的简化对象列表。相反,它们只包含必要的ID,我稍后在“保存”方法中使用它来执行实际更新。所以现在它看起来像这样:
<h:selectOneRadio id="facility" value="#{orgFacility.typeId}">