2014-01-19 4 views
1

지난 3 일 동안 나는 다음과 같은 작업을 해왔습니다. 뒷받침 빈에서 데이터를 가져오고 세 개의 라디오 버튼이있는 열을 보여주는 데이터 테이블을 가지고 있습니다. 페이지가 예상대로 렌더링되고 라디오 버튼이 올바른 값을 얻습니다. 그러나 양식을 제출하는 것은 의도 한대로 수행되지 않습니다. 양식을 제출할 때마다 해당 객체의 값은 표의 마지막 객체 값으로 설정됩니다. 이상하게도, Fiddler를 통해 전송되는 양식을 볼 때 마지막 행의 개체 값을 복제하는 대신 올바른 값이 전송됩니다. selectOneRadio id와 관련이 있다고 생각하지만 id에 대한 동적 값을 설정하면 오류가 발생합니다.부자 제출 : h 열의 datatable : selectOneRadio

미리 감사 드리며 더 많은 정보가 필요하면 알려 주시기 바랍니다.

<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

추가''시간'에서 : selectOneRadio' –

+0

나는 것을 시도 , 그러나 그것은 또한 약간의 문제를 가지고 있었다. 댓글을 주셔서 감사합니다. 그동안 나는 해결책을 생각해 냈습니다. 누군가 내가 실수 한 것과 동일한 실수를 저지르는 경우에 대비하여 답변으로 추가하겠습니다. –

답변

0

난 그냥이 문제에 대한 내 자신의 대답을 발견했다. 보통의 방법으로는 최적이 아니거나 완벽하지 않을 수 있으므로 제 질문에 대한 해결책을 생각해 내십시오.

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

내가 예상대로 중첩 된 속성이 처리되지 않는 것 같습니다 :

이 줄

은 범인 것 같았다. 중첩 된 속성없이 단순화 된 개체의 목록을 반환하도록 'getFindAllFacilitiesForCurrentOrganisation'메서드를 변경하여이 문제를 해결했습니다. 대신 그들은 실제 업데이트를 수행하기 위해 나중에 'save'메소드에서 사용하는 필요한 ID를 포함합니다. 그래서 지금은 다음과 같습니다

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