Kanika Prime
Kanika Prime

Reputation: 105

Primefaces Collector Remove not working

I am testing the primefaces collector example given in Showcase for my code I read somewhere that its necessary to override the equals and hashcode method for that.

Even after overriding the methods , I am still getting the same error.

Kindly tell me whats wrong in my code

User.java

  @ManagedBean
  public class User implements Serializable{

        public String name;
        public String designation;
        public String division;

public User(String name,String division){
   setName(name);
   setDivision(division);
}
public User(){

}

public String getDesignation() {
    return designation;
}

public void setDesignation(String designation) {
    this.designation = designation;
}


public String getDivision() {
    return division;
}

public void setDivision(String userDivision) {
    this.division = userDivision;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

}

commApprover.java

@ManagedBean
@ViewScoped
public class CommApprover implements Serializable{

private User approver = new User();

private List<User> approvers = new ArrayList<User>();

public String reinit() {
    approver = new User();

    return null;
}

public User getApprover() {
    return approver;
}

public void setApprover(User approver) {
    this.approver = approver;
}

public List<User> getApprovers() {
    return approvers;
}

public void setApprovers(List<User> approvers) {
    this.approvers = approvers;
}

@Override
public boolean equals(Object o) 
{ 
    if (this == o) 
        return true; 
    if (o == null || getClass() != o.getClass()) 
        return false; 
     if (approver!= null ? !approver.equals(this.approver) : this.approver != null) 
         return false;

     return true; 
 }  

     @Override 
     public int hashCode() 
     { 
         int result = approver.hashCode(); 

         return result; 
     } 

}

index.xhtml

<p:growl id="msgs" />

<p:panel header="Approval Route ">
        <h:panelGrid columns="3" id="grid">
            <h:outputText  value="Name*" />
  <h:outputText value="Designation*" />
<h:outputText value="Division*" />

<p:inputText id="app_name" value="#{commApprover.approver.name}" required="true"/>
<p:inputText id="app_designation" value="#{commApprover.approver.designation}"     required="true"/>
<p:inputText id="app_division" required="true" value="#    {commApprover.approver.division}" />


<p:commandButton id="btn_add" value="Add" update="approvers @parent" action="#{commApprover.reinit}" >
<p:collector value="#{commApprover.approver}"  addTo="#{commApprover.approvers}" />
</p:commandButton>

</h:panelGrid>

</p:panel>

<p:outputPanel id="approvers">
<p:dataTable id="approversTable" value="#{commApprover.approvers}" var="approver">

<p:column>
<f:facet name="header">
    <h:outputText value="Name" />
</f:facet>
<h:outputText value="#{approver.name}" />
</p:column>

<p:column>
<f:facet name="header">
<h:outputText value="Designation" />
</f:facet>
<h:outputText value="#{approver.designation}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Division" />
</f:facet>
<h:outputText value="#{approver.division}" />
</p:column>

<p:column>
<f:facet name="header">
<h:outputText value="Operation" />
</f:facet>
<p:commandLink ajax="true" value="Remove" update=":appform:approvers" process=":appform:approvers">
<p:collector  value="#{approver}" removeFrom="#{commApprover.approvers}" />
</p:commandLink>
</p:column>
</p:dataTable>
</p:outputPanel>

   </h:form>

Upvotes: 1

Views: 1283

Answers (1)

neo
neo

Reputation: 11

This post is old but I ran into the same problem and after some debuging I found out that this problem is related to incorrectly implemented hashCode and equals, when using converters or p:collector you have to implement hashCode and equals to compare all fields in your entity otherwise it fails even if the item you are trying to remove is the correct one. Also it is recomended that you override those properties in your Pojo not in you ManagedBean. This post helped me to understand the problem https://blog.art-of-coding.eu/jsf-converters-and-equals-hashcode/

Upvotes: 1

Related Questions