2014-09-04 2 views
1

처음에는 데이터가없는 데이터 테이블 (빈 목록)이 있습니다. 테이블 바닥 글에 행을 테이블에 추가하는 commandButton이 있습니다. 행이 추가되면 행의 마지막 셀은 행을 삭제할 또 다른 commandButton입니다. 내 문제는 삭제 단추가 선택한 행에 관계없이 테이블의 첫 번째 행을 계속 삭제한다는 것입니다.commandButton action = "# {bean.delete (row)}"가 잘못된 행을 전달하는 것 같습니다.

예 : 테이블에 3 개의 행을 추가하고 두 번째 행의 마지막 셀에있는 삭제 버튼을 누르면 action="#{addAccountBean.deleteFixVendor(dataItem)}"은 클릭 된 두 번째 행 대신 첫 번째 행을 deleteFixVendor 메쏘드로 전달합니다. 나는 첫 번째 행에 대한 객체가 어떤 행 버튼이 클릭되었는지에 관계없이 delete 메소드에 전달되는 것을 계속 유지하는 이유를 알 수 없습니다.

내 JSF 코드 :

<h:form> 
<f:validateBean disabled="#{!empty param['disableValidation']}" > 
<p:panel id="panel" header="Add New Account" > 
    <p:dataTable var="dataItem" value="#{addAccountBean.account.vendors}" > 

     <p:column headerText="Vendor" >         
      <p:selectOneMenu value="#{dataItem.vendor}">     
         <f:selectItems value="#{addAccountBean.menu.fixOption}" /> 
        </p:selectOneMenu> 
      </p:column> 

      <p:column headerText="Monthly Cost" > 
       <p:inputText value="#{dataItem.cost}" />  
      </p:column> 

      <p:column headerText="Cost Date" > 
       <p:calendar value="#{dataItem.CDate}" pattern="MM/dd/yyyy" navigator="true" /> 
      </p:column> 

      <p:column headerText="Delete" > 
      <h:commandButton value="Delete" action="#{addAccountBean.deleteFixVendor(dataItem)}" > 
       <f:param name="disableValidation" value="true" /> 
      </h:commandButton> 
     </p:column> 

     <f:facet name="footer" > 
      <h:commandButton value="Add New Vendor" action="#{addAccountBean.addFixVendor}" > 
       <f:param name="disableValidation" value="true" /> 
      </h:commandButton>  
     </f:facet> 

    </p:dataTable>   
</p:panel> 
</f:validateBean> 
</h:form> 

콩 코드 : 어떤 제안을 부탁드립니다

@ManagedBean 
@SessionScoped 
public class AddAccountBean implements Serializable { 

private AccountData account = new AccountData(); 

public String addFixVendor() { 

    account.getVendors().add(new VendorData());     
    return ""; 
} 

public String deleteFixVendor(VendorData vData) { 

    account.getVendors().remove(vData);       
    return "";               
} 

.

+1

당신은 그것을 결론나요 관찰 또는 디버깅을 기반으로? 'deleteFixVendor()'메소드에 중단 점을 넣고 전달 된'vData' 인스턴스를 검사 했습니까? 아니면 단순히 최종 결과를 관찰하고 전달 된 'vData' 인스턴스가 첫 번째 행이라고 가정 했습니까? 즉,이 문제는 JSF/EL 자체가 아닌'VendorData' 클래스의'equals()'메소드가 깨져서 발생합니다. – BalusC

+0

감사합니다. @BalusC. 그것은'VendorData' 클래스에서 깨진'equals()'메소드의 결과였습니다. 이제 작동 중입니다. – Stevenyc091

+0

좋습니다. 나는 대답을 올렸다. – BalusC

답변

1

지금까지 게시 된 코드는 괜찮습니다. 이 문제에 대한 유일한 가능한 설명은 VendorData 클래스의 깨진 equals() 메서드입니다. Collection#remove()은 주어진 객체 인 equals() 컬렉션의 첫 번째 항목을 제거합니다.

이 (기본) 개체가 id 속성을 가지고 제공, 다음이 수행해야합니다

@Override 
public boolean equals(Object other) { 
    return (other != null && getClass() == other.getClass() && id != null) 
     ? id.equals(((VendorData) other).id) 
     : (other == this); 
} 

@Override 
public int hashCode() { 
    return (id != null) 
     ? (getClass().hashCode() + id.hashCode()) 
     : super.hashCode(); 
} 
관련 문제