To fetch checkbox selected values from primefaces datatable to managed bean - jsf-2

I am trying to fetch the checkbox selected values selectedCars from primefaces datatable to my managed bean named TableBean.I am getting null pointer exception at the point where I am trying to fetch the values in the function getSelection() please help me with this
My JSF page:
<h:form id="form">
<p:dataTable id="multiCars" var="car"
value="#{tableBean.mediumCarsModel}" paginator="true" rows="10"
selection="#{tableBean.selectedCars}">
<f:facet name="header">
Checkbox Based Selection
</f:facet>
<p:column selectionMode="multiple" style="width:2%" />
<p:column headerText="Model" style="width:25%">
#{car.model}
</p:column>
<p:column headerText="Year" style="width:25%">
#{car.year}
</p:column>
<p:column headerText="Manufacturer" style="width:24%">
#{car.manufacturer}
</p:column>
<p:column headerText="Color" style="width:24%">
#{car.color}
</p:column>
<f:facet name="footer">
<p:commandButton id="multiViewButton" value="View"
icon="ui-icon-search" update=":form:displayMulti"
oncomplete="multiCarDialog.show()" />
</f:facet>
</p:dataTable>
<p:dialog id="multiDialog" header="Car Detail"
widgetVar="multiCarDialog" height="300" showEffect="fade"
hideEffect="explode">
<p:dataList id="displayMulti" value="#{tableBean.selectedCars}"
var="selectedCar">
Model: #{selectedCar.model}, Year: #{selectedCar.year}
</p:dataList>
</p:dialog>
</h:form>
My managed bean
#SessionScoped
#ManagedBean
public class TableBean implements Serializable {
private List<Car> cars;
private Car[] selectedCars;
private CarDataModel mediumCarsModel;
Connection connection;
Statement stmt;
ResultSet rs;
public TableBean() {
cars = new ArrayList<Car>();
getCars();
getSelection();
mediumCarsModel = new CarDataModel(cars);
}
public Car[] getSelectedCars() {
return selectedCars;
}
public void setSelectedCars(Car[] selectedCars) {
this.selectedCars = selectedCars;
}
public void getCars() {
int i = 0;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:jtds:sqlserver://cvgapp106I/dev2_LPSR");
System.out.println("connected to the database");
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from test");
while(rs.next()) {
cars.add(i,new Car(rs.getString("Model"),rs.getInt("Year"),rs.getString("Manufacturer"),rs.getString("Color")));
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getSelection() {
System.out.println(selectedCars[0].getModel());
}
public CarDataModel getMediumCarsModel() {
return mediumCarsModel;
}
public void setMediumCarsModel(CarDataModel mediumCarsModel) {
this.mediumCarsModel = mediumCarsModel;
}
}

public void getSelection() {
System.out.println(selectedCars[0].getModel());
}
This will throw NullPointerException if the list is empty.
If you really want to use this then you should try check if the list not null
if(selectedCars!=null && !selectedCars.isEmpty()){
System.out.println(selectedCars[0].getModel());
}

Do not call getSelection() in your constructor. There selectedCars will be always null

Related

Alternate single and multiple selection with p:dataTable

Need some help to know if my solution is valid or not.
I have a primefaces datatable with single row selection, and I need to add a multiple selection checkbox column... My idea is to switch selection mode clicking on one button, that switch the selection mode from single to multiple and vice versa....
<pf:dataTable
value="${bean.notifications}"
var="notif"
selection="#{bean.isMultiple() ? consulterCorbeilleBean.selectedNotifs : consulterCorbeilleBean.selectedNotif}"
selectionMode="#{not bean.isMultiple() ? 'single' : ''}"
rowKey="${notification.cle.idNotification}">
<pf:ajax event="rowSelect" disabled="${bean.isMultiple()}"
listener="${bean.function()}" update=":table:notificationTable"
oncomplete="stopPropagationClick()" />
<pf:column selectionMode="multiple" rendered="#{bean.isMultiple()}"/>
</pf:dataTable>
I have a problem with the selection binding. I have this error :
Illegal Syntax for Set Operation:
javax.el.PropertyNotWritableException: /index.xhtml #114,50
selection="#{bean.isMultiple() ? bean.selectedNotifs :
bean.selectedNotif}"
Any idea to workaround ? I use Primefaces 3.2.
Best Regards and thanks for your help :)
You can't use dynamic setter values on the selection.
I would rethink the design if i were you, but if you really need both single and multiple selection options on the same table, you could use 2 datatables and render only 1 of them at a time, and switch between them with a button click.
If you really need it, then you can try this work example
View
<h:form id="form">
<p:growl id="msgs" showDetail="true" for="basicDT" />
<p:inputSwitch value="#{dtSelectionView.multiple}">
<p:ajax listener="#{dtSelectionView.addMessage}" update="basicDT, msgs" />
</p:inputSwitch>
<p:dataTable
id="basicDT"
var="car"
value="#{dtSelectionView.cars1}"
rowStyleClass="#{dtSelectionView.checkSelection(car)? 'ui-state-highlight':''}"
>
<f:facet name="header">
DoubleSelect
</f:facet>
<p:column style="width:32px">
<p:commandButton update="basicDT,:form:msgs,:form:carDetail,:form:multiCarDetail" icon="ui-icon-check" actionListener="#{dtSelectionView.addSelection(car)}" />
</p:column>
<p:column headerText="Id">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year">
<h:outputText value="#{car.year}" />
</p:column>
<p:column headerText="Brand">
<h:outputText value="#{car.brand}" />
</p:column>
<p:column headerText="Color">
<h:outputText value="#{car.color}" />
</p:column>
</p:dataTable>
<p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false" closeOnEscape="true">
<p:outputPanel id="carDetail" style="text-align:center;">
<p:panelGrid columns="2" rendered="#{not empty dtSelectionView.selectedCar}" columnClasses="label,value">
<h:outputText value="Id:" />
<h:outputText value="#{dtSelectionView.selectedCar.id}" />
<h:outputText value="Year" />
<h:outputText value="#{dtSelectionView.selectedCar.year}" />
<h:outputText value="Color:" />
<h:outputText value="#{dtSelectionView.selectedCar.color}" style="color:#{dtSelectionView.selectedCar.color}"/>
<h:outputText value="Price" />
<h:outputText value="$#{dtSelectionView.selectedCar.price}" />
</p:panelGrid>
</p:outputPanel>
</p:dialog>
<p:dialog header="Selected Cars" widgetVar="multiCarDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false" width="200">
<p:outputPanel id="multiCarDetail" style="text-align:center;">
<ui:repeat value="#{dtSelectionView.selectedCars}" var="car">
<h:outputText value="#{car.id} - #{car.brand}" style="display:block"/>
</ui:repeat>
</p:outputPanel>
</p:dialog>
</h:form>
Model
import java.io.Serializable;
public class Car implements Serializable{
private String Id;
private String Brand;
private int Year;
private String Color;
private int Price;
private boolean SoldState;
public Car(String id, String brand, int year, String color, int price,
boolean soldState) {
super();
Id = id;
Brand = brand;
Year = year;
Color = color;
Price = price;
SoldState = soldState;
}
#Override
public boolean equals(Object o){
if(o == null) return false;
if(!(o instanceof Car)) return false;
Car other = (Car) o;
if(! this.Id.equals(other.Id)) return false;
if(! this.Brand.equals(other.Brand)) return false;
if(this.Year != other.Year) return false;
if(! this.Color.equals(other.Color)) return false;
if(this.Price != other.Price) return false;
if(this.SoldState != other.SoldState) return false;
return true;
}
#Override
public int hashCode(){
return (int) Id.hashCode() *
Brand.hashCode() *
Year *
Color.hashCode() *
Price *
(SoldState ? 31 : 32)
;
}
/** getters/setters */
}
Bean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;
#ManagedBean(name="dtSelectionView")
#ViewScoped
public class SelectionView implements Serializable {
private List<Car> cars1;
private Car selectedCar;
private List<Car> selectedCars;
private boolean multiple= false;
#ManagedProperty("#{carService}")
private CarService service;
#PostConstruct
public void init() {
cars1 = service.createCars(10);/** random generated List. See PF showcase, datatable examples*/
selectedCars = new ArrayList<Car>();
}
public boolean checkSelection(Car car){
if(isMultiple())
return selectedCars.contains(car) ? true : false;
else
return car.equals(selectedCar) ? true : false;
}
public void addSelection(Car car){
String summary = "Car was ";
if(isMultiple())
if(selectedCars.contains(car)){
selectedCars.remove(car);
summary += "removed from list.";
}
else{
selectedCars.add(car);
summary += "added to list.";
RequestContext.getCurrentInstance().execute("PF('multiCarDialog').show();");
}
else
if(car.equals(selectedCar)){
selectedCar = null;
summary += "unselected.";
}
else{
selectedCar = car;
summary += "selected.";
RequestContext.getCurrentInstance().execute("PF('carDialog').show();");
}
FacesContext.getCurrentInstance().addMessage("basicDT", new FacesMessage(summary));
}
public void setService(CarService service) {
this.service = service;
}
public Car getSelectedCar() {
return selectedCar;
}
public List<Car> getSelectedCars() {
return selectedCars;
}
public void onRowSelect(SelectEvent event) {
FacesMessage msg = new FacesMessage("Car Selected", ((Car) event.getObject()).getId());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onRowUnselect(UnselectEvent event) {
FacesMessage msg = new FacesMessage("Car Unselected", ((Car) event.getObject()).getId());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void addMessage() {
selectedCar = null;
selectedCars = new ArrayList<Car>();
String summary = multiple ? "Checked" : "Unchecked";
FacesContext.getCurrentInstance().addMessage("basicDT", new FacesMessage(summary));
}
public List<Car> getCars1() {
return cars1;
}
public void setCars1(List<Car> cars1) {
this.cars1 = cars1;
}
public CarService getService() {
return service;
}
public boolean isMultiple() {
return multiple;
}
public void setMultiple(boolean multiple) {
this.multiple = multiple;
}
}
Hope You'll in right direction.

no records found in my jsf page

I am trying to retrive data from my database and it actually worked for another table but with this one there is only no records found without any error message in the log file here is my code :
#ManagedBean
#SessionScoped
public class AnnonceBean implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private List<SelectItem> anonItems;
private DataModel annonces;
private Annonce newAnnonce = new Annonce();
private Annonce editAnnonce;
private DaoAnnonce aDao = new DaoAnnonce();
public List<SelectItem> getAnonItems() {
if (anonItems == null) {
anonItems = new ArrayList<SelectItem>();
List<Annonce> annList = aDao.selectAll();
for (Annonce an : annList) {
anonItems.add(new SelectItem((Annonce) an, ((Annonce) an)
.getTitre()));
anonItems.add(new SelectItem((Annonce) an, ((Annonce) an)
.getContenu()));
anonItems.add(new SelectItem((Annonce) an, ((Annonce) an)
.getProfesseur().getPrenom()));
}
}
return anonItems;
}
public AnnonceBean() {
if (annonces == null) {
annonces = new ListDataModel();
annonces.setWrappedData(aDao.selectAll());
}
}
public String creer() {
return "add";
}
public String create() {
aDao.ajouter(newAnnonce);
newAnnonce = new Annonce();
annonces.setWrappedData(aDao.selectAll());
FacesMessage msg = new FacesMessage("Ajout effectué avec succés");
FacesContext.getCurrentInstance().addMessage(null, msg);
return "list";
}
public String deleteGroupe() {
Annonce a = (Annonce) annonces.getRowData();
aDao.supprimer(a);
FacesMessage msg = new FacesMessage("Suppression effectué avec succés");
FacesContext.getCurrentInstance().addMessage(null, msg);
return null;
}
public String editAnnonce() {
editAnnonce=(Annonce)annonces.getRowData();
return "edit";
}
public String updateAnnonce(){
aDao.modifier(editAnnonce);
annonces.setWrappedData(aDao.selectAll());
FacesMessage msg = new FacesMessage("Modification effectué avec succés");
FacesContext.getCurrentInstance().addMessage(null, msg);
return "list";
}
and this is my Dao class code
public class DaoAnnonce {
private static final String JPA_UNIT_NAME="Portail";
private EntityManager entityManager;
protected EntityManager getEntityManager() {
if (entityManager == null) {
entityManager = Persistence.createEntityManagerFactory(
JPA_UNIT_NAME).createEntityManager();
}
return entityManager;
}
public void ajouter(Annonce a)
{
EntityTransaction tx = getEntityManager().getTransaction();
tx.begin();
entityManager.persist(a);
tx.commit();
}
public void modifier(Annonce a)
{
EntityTransaction tx = getEntityManager().getTransaction();
tx.begin();
entityManager.merge(a);
tx.commit();
}
public void supprimer(Annonce a)
{
EntityTransaction tx = getEntityManager().getTransaction();
tx.begin();
a=entityManager.merge(a); // important
entityManager.remove(a);
tx.commit();
}
public List<Annonce > selectAll() {
List<Annonce > annonces =getEntityManager().createQuery("select a from Annonce a").getResultList();
return annonces;
}
and this the jsf code
<p:tab title="Annonces">
<p:dataTable var="annonce" value="#{annonceBean.annonces}"
editable="true">
<p:ajax event="rowEdit" listener="#{tableBean.onEdit}" />
<p:ajax event="rowEditCancel" listener="#{tableBean.onCancel}" />
<p:column headerText="Titre" style="width:30%">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{annonce.titre}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{annonce.titre}" style="width:100%" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Contenu" style="width:20%">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{annonce.contenu}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{annonce.contenu}" style="width:100%"
label="contenu" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Professeur" style="width:24%">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{annonce.prenom}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{annonce.prenom}" style="width:100%"
label="prenom" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</p:tab>
I am working on eclipse and i am using primefaces for the components
In your bean AnnonceBean there is no method called getAnnonces(), but there is a method getAnonItems() returning a List<SelectItem> which is probably what you want. If this is the case, #{annonceBean.annonces} should be replaced by #{annonceBean.anonItems}.

operations on validated text fields in jsf

I'm Using Primefaces 3.5. I have around 10 input text fields in my .xhtml page.Few text fields are made mandatory with attribute required="true".
I have a search button that displays Data from Database in a Data Table.The functionality of my page is to insert the values into these fields by on row select() the data in the Data Table of Search Button.
The Problem here is the data is inserting into the Fields which are highlighted with the red border ie fields with validations applied.
Example:
Transport Field has no validation but it had value that has to be inserted. These type of things are happening to many of my Input Fields.
Please give me some suggestions.
.xhtml file is:
<p:inputText id="email" value="#{addcust.c.email}" required="true"
validatorMessage="Enter Valid Email">
<f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*#[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$"/></p:inputText>
<h:outputLabel value="Transport"></h:outputLabel>
<p:inputText value="#{addcust.c.transport}" </p:inputText>
<p:commandButton value="add" type="submit" update=":form,:msg" actionListener="#{addcust.onAddSelect}"</p:commandButton>
<p:commandButton value="Search" type="submit" onclick="ser.show() "></p:commandButton>
<p:dialog id="dialog11" header=" Search" widgetVar="ser" resizable="false" showEffect="fade"
hideEffect="explode" >
<p:dataTable id="dt" var="sd" value="#{addcust.al}" selection="#{addcust.c}">
<p:ajax event="rowSelect" update=":form" listener="#{addcust.onRowSelect}"
oncomplete="ser.hide()"/>
<p:column>
<f:facet name="header">
<h:outputText value="Email"/>
</f:facet>
<h:outputText value="#{sd.email}"/>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Transport"/>
</f:facet>
<h:outputText value="#{sd.transport}"/>
</p:column>
</p:dataTable>
customerbean.java
public class customerbean {
private String email;
private String transport;
public String getTransport() {
return transport;
}
public void setTransport(String transport) {
this.transport = transport;
}
return email;
}
public void setEmail(String email) {
this.email = email;
}
addcust.java
public customerbean c = new customerbean();
public ArrayList<customerbean> al;
public void onAddSelect(){
// Inserted my values into customer table.
}
public void onSearchSelect() {
try {
st = con.createStatement();
ResultSet rs = st.executeQuery("select * from customer where cmpid=" + getCurrcompanyid() + "");
al = new ArrayList<customerbean>();
while (rs.next()) {
customerbean s = new customerbean();
s.setEmail(rs.getString(1));
s.setTransport(rs.getString(2));
}
} catch (Exception e) {
System.out.println(e);
}
}
public void onRowSelect(SelectEvent event) throws SQLException {
customerbean r = (customerbean)event.getObject();
c = r;
}
If I'm not clear enough please leave me a comment .Thanks for Reading.

p:dataTable how to stay in edit mode?

I'm using primefaces 3.5 and watching a strange datatable behavior when editing data.
If I enter wrong data in 'year' field and click on the tick I get a message about mistake.
But if I don't click on the tick and click on the 'Add row' button I don't get a message. Only new row is added.
I expect to stay in edit mode. How to solve this problem?
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="In cell editing" />
<p:dataTable id="inCellEditing" var="car" value="#{dataTableController.cars}" rowKey="#{car.name}" editable="true">
<p:ajax event="rowEdit" listener="#{dataTableController.onEdit}" update=":mainForm:growl" />
<p:ajax event="rowEditCancel" listener="#{dataTableController.onCancel}" update=":mainForm:growl" />
<p:column headerText="Year">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{car.year}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{car.year}">
<p:ajax event="blur" update="#this"/>
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Name">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{car.name}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu value="#{car.name}" >
<f:selectItems value="#{dataTableController.carNames}"
var="name"
itemLabel="#{name}"
itemValue="#{name}" />
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Actions">
<p:rowEditor />
</p:column>
</p:dataTable>
<p:commandButton action="#{dataTableController.addRow()}" value="Add row" ajax="false"/>
</h:panelGrid>
public class DataTableController implements Serializable {
private List<Car> cars;
private Car selectedCar;
private Car[] selectedCars;
private List<Car> selectedCarsList;
private SelectItem[] carNamesOptions;
public DataTableController() {
cars = new ArrayList<Car>(CarConverter.cars.values());
}
public String[] getCarNames() {
return CarConverter.cars.keySet().toArray(new String[0]);
}
public SelectItem[] getCarNamesAsOptions() {
carNamesOptions = createFilterOptions(CarConverter.cars.keySet().toArray(new String[0]));
return carNamesOptions;
}
private SelectItem[] createFilterOptions(String[] data) {
SelectItem[] options = new SelectItem[data.length + 1];
options[0] = new SelectItem("", "Select");
for(int i = 0; i < data.length; i++) {
options[i + 1] = new SelectItem(data[i], data[i]);
}
return options;
}
public void onEdit(RowEditEvent event) {
MessageUtil.addInfoMessage("car.edit", ((Car) event.getObject()).getName());
}
public void onCancel(RowEditEvent event) {
MessageUtil.addInfoMessage("car.edit.cancelled", ((Car) event.getObject()).getName());
}
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
public Car[] getSelectedCars() {
return selectedCars;
}
public void setSelectedCars(Car[] selectedCars) {
this.selectedCars = selectedCars;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
public List<Car> getSelectedCarsList() {
return selectedCarsList;
}
public void setSelectedCarsList(List<Car> selectedCarsList) {
this.selectedCarsList = selectedCarsList;
}
public void addRow(){
cars.add(new Car("",0));
}
}

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>
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/

Resources