Compare two list objects in java - java

I have the following simple java program to compare two objects in list.
public static void main( String[] args )
{
UserInfo user=new UserInfo();
user.setDomainId(2);
user.setId("sxpadmin");
user.setStatus("active");
UserInfo user1=new UserInfo();
user1.setDomainId(2);
user1.setId("sxpadmin");
user1.setStatus("active");
System.out.println(user.equals(user1));
List<UserInfo> userinfo=new ArrayList<UserInfo>();
userinfo.add(user);
userinfo.add(user1);
HashSet<UserInfo> set = new HashSet<UserInfo>();
for (UserInfo temp : userinfo)
{
if(set.contains(temp)){
System.out.println("same");
}
else{
System.out.println("different");
set.add(temp);
}
}
}
Now I am comparing the two objects and it should take to if block as the content in both the objects is same.
I am iterating the userinfo object and comapring its elements and also I am adding it to set hoping to avoid the duplicates.But none of them worked. Help me in solving this.
Hashcode and equals methods in UserInfo are
#Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + customer_id;
result = prime * result
+ ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result
+ ((last_name == null) ? 0 : last_name.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result
+ ((first_name == null) ? 0 : first_name.hashCode());
// Added by Sandip on 04 Jan 2013 for 2 FA
result = prime * result
+ ((seed_value == null) ? 0 : seed_value.hashCode());
// End added by Sandip on 04 Jan 2013 for 2 FA
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserInfo other = (UserInfo) obj;
if (customer_id != other.customer_id)
return false;
if (last_name == null) {
if (other.last_name != null)
return false;
} else if (!last_name.equals(other.last_name))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (first_name == null) {
if (other.first_name != null)
return false;
} else if (!first_name.equals(other.first_name))
return false;
// Added by Sandip on 04 Jan 2013 for 2 FA
if (seed_value == null) {
if (other.seed_value != null)
return false;
} else if (!seed_value.equals(other.seed_value))
return false;
// End added by Sandip on 04 Jan 2013 for 2 FA
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
return true;
}

If you want to create working solution here's what you have to override equals and hashCode method.
Many IDE's have feature to autogenerate those methods for chosen class. Following code of UserInfo shows methods generated by IntelliJ:
public class UserInfo {
private int domainId;
private String id;
private String status;
public void setDomainId(int domainId) {
this.domainId = domainId;
}
public void setId(String id) {
this.id = id;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserInfo userInfo = (UserInfo) o;
if (domainId != userInfo.domainId) return false;
if (id != null ? !id.equals(userInfo.id) : userInfo.id != null) return false;
if (status != null ? !status.equals(userInfo.status) : userInfo.status != null) return false;
return true;
}
#Override
public int hashCode() {
int result = domainId;
result = 31 * result + (id != null ? id.hashCode() : 0);
result = 31 * result + (status != null ? status.hashCode() : 0);
return result;
}
}
It's important to remember that if certain class doesn't implement those methods then hashCode is returning hash of objects address in memory and equals is using this default version of hashCode.
Code pasted above is working with code pasted by you. My output is:
true
different
same

Related

StackOverflowError in equals method of bidirectional objects

I have to objects Client and Order and these objects are living in bidirectional relation and I try to write them to file, but I get StackOverflowError. I got this error because my equals methods are looped.
My classes which I try to serialize:
#Getter
#Setter
#AllArgsConstructor
#NoArgsConstructor
public class Client implements Serializable {
private Long id;
private String name;
private List<Order> orders = new ArrayList<>();
public void addOrder(Order order) {
order.setClient(this);
orders.add(order);
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Client client = (Client) o;
if (id != null ? !id.equals(client.id) : client.id != null) return false;
if (name != null ? !name.equals(client.name) : client.name != null) return false;
return orders != null ? orders.equals(client.orders) : client.orders == null;
}
#Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (orders != null ? orders.hashCode() : 0);
return result;
}
#Override
public String toString() {
return "Client{" +
"id=" + id +
", name='" + name + '\'' +
// ", orders=" + orders.size() +
'}';
}
}
#Getter
#Setter
#AllArgsConstructor
#NoArgsConstructor
public class Order implements Serializable {
private Long id;
private String name;
private Client client;
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Order order = (Order) o;
if (id != null ? !id.equals(order.id) : order.id != null) return false;
if (name != null ? !name.equals(order.name) : order.name != null) return false;
return client != null ? client.equals(order.client) : order.client == null;
}
#Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (client != null ? client.hashCode() : 0);
return result;
}
#Override
public String toString() {
return "Order{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
#Data
#AllArgsConstructor
public class MapDataSource implements Serializable {
private final Map<Date, List<Client>> clients = new HashMap<>();
private final Map<Date, List<Order>> orders = new HashMap<>();
}
#Slf4j
public class ObjectWriter {
private final String fileName = "data.obj";
public void write(String fileName, MapDataSource mapDataSource) {
try (
FileOutputStream fs = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fs)
) {
oos.writeObject(mapDataSource);
log.info("Object has been written.");
} catch (IOException ioe) {}
}
}
#Slf4j
public class ObjectReader {
private static final String fileName = "data.obj";
public MapDataSource readObj(String fileName) {
MapDataSource mapDataSource = null;
try (
FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis)
) {
mapDataSource = ((MapDataSource) ois.readObject());
// log.info("Read object: {}", mapDataSource);
} catch (IOException ioe) {
} catch (ClassNotFoundException classEx) {
System.out.println();
}
return mapDataSource;
}
}
And when I try to run code below I get StackOVerflowError:
String testFile = "testFile.obj";
final DateTime time = new DateTime(2017, 12, 1, 10, 0);
final Client client1 = new Client(1L, "Client1", new ArrayList<>());
final Order order1 = new Order(1L, "Order1", null);
final MapDataSource mapDataSource = new MapDataSource();
mapDataSource.getClients().put(time.toDate(), new ArrayList<>());
mapDataSource.getClients().get(time.toDate()).add(client1);
mapDataSource.getOrders().put(time.toDate(), new ArrayList<>());
mapDataSource.getOrders().get(time.toDate()).add(order1);
new ObjectWriter().write(testFile, mapDataSource);
final MapDataSource found = new ObjectReader().readObj(testFile);
System.out.println(found);
Solution:
MapDataSource needs to have implemented equals() and hashcode() methods.
It seems like you need to sit down and seriously consider what it should even mean for two clients or orders to be equal in the first place. The Long id; makes me wonder whether you should really be comparing the object graphs in the first place. If e.g. clients have unique IDs, then it could make sense to just ensure that clients are unique object instances and then you do away with the problem entirely.
If you really do need to compare object graphs, you could use something like the following. We use an IdentityHashMap to record all of the objects we've seen, then if we detect a cycle, we just compare the previously-stored counter values which tells us if the two graphs have the same cycle.
Client and Order need to share code (so the maps can be passed around), so you just override equals in both to return ClientOrderEquality.equals(this, that).
import java.util.*;
public final class ClientOrderEquality {
private ClientOrderEquality() {}
private static final class Counter { long value; }
public static boolean equals(Client lhs, Client rhs) {
return equals(lhs, new IdentityHashMap<>(),
rhs, new IdentityHashMap<>(),
new Counter());
}
public static boolean equals(Order lhs, Order rhs) {
return equals(lhs, new IdentityHashMap<>(),
rhs, new IdentityHashMap<>(),
new Counter());
}
private static boolean equals(Client lhs,
Map<Object, Long> seenL,
Client rhs,
Map<Object, Long> seenR,
Counter counter) {
if (lhs == null || rhs == null)
return lhs == rhs;
Long countL = seenL.putIfAbsent(lhs, counter.value);
Long countR = seenR.putIfAbsent(rhs, counter.value);
if (countL != null || countR != null)
return Objects.equals(countL, countR);
counter.value++;
if (lhs == rhs)
return true;
if (!Objects.equals(lhs.id, rhs.id))
return false;
if (!Objects.equals(lhs.name, rhs.name))
return false;
if (lhs.orders.size() != rhs.orders.size())
return false;
Iterator<Order> itL = lhs.orders.iterator();
Iterator<Order> itR = rhs.orders.iterator();
while (itL.hasNext() && itR.hasNext())
if (!equals(itL.next(), seenL, itR.next(), seenR, counter))
return false;
return true;
}
private static boolean equals(Order lhs,
Map<Object, Long> seenL,
Order rhs,
Map<Object, Long> seenR,
Counter counter) {
if (lhs == null || rhs == null)
return lhs == rhs;
Long countL = seenL.putIfAbsent(lhs, counter.value);
Long countR = seenR.putIfAbsent(rhs, counter.value);
if (countL != null || countR != null)
return Objects.equals(countL, countR);
counter.value++;
if (lhs == rhs)
return true;
if (!Objects.equals(lhs.id, rhs.id))
return false;
if (!Objects.equals(lhs.name, rhs.name))
return false;
return equals(lhs.client, seenL, rhs.client, seenR, counter);
}
}
I assume if you want to actually use that code, you'll need to alter it to use whatever getter naming format you're using and write a hashCode implementation. You'll also need to consider subtypes correctly if you're extending Client and Order.

Java: Set.contains() gives wrong result

Since Set.contains(Object o) should just use equals to check if an object is in a Set, how can the following two methods produce different results? In my project, method 1 does not throw an exception, but method 2 does throw an exception.
For information, the object "group" is in the set "groups", so Method 1 works like I would expect it.
boolean java.util.Set.contains(Object o)
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
Method 1:
boolean ex = true;
for (AccessControlGroup acg : groups) {
if ((acg.equals(group))) {
ex = false;
}
}
if (ex) {
throw new IllegalStateException("Invalid group");
}
Method 2:
if (!(groups.contains(group))) {
throw new IllegalStateException("Invalid group");
}
Further information:
HashSet is used.
AccessControlGroup:
public List<AccessControlGroup> getInherits() {
if (this.inherits == null) {
this.inherits = new ArrayList<>();
}
return this.inherits;
}
public void setInherits(List<AccessControlGroup> inherits) {
this.inherits = inherits;
}
public List<AccessControlPermission> getPermissions() {
if (this.permissions == null) {
this.permissions = new ArrayList<>();
}
return this.permissions;
}
public void setPermissions(List<AccessControlPermission> permissions) {
this.permissions = permissions;
}
#Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
// prevent infinity loops or other sick effects
// result = prime * result + ((this.inherits == null) ? 0 : this.inherits.hashCode());
result = prime * result + ((this.permissions == null) ? 0 : this.permissions.hashCode());
result = prime * result + ((this.type == null) ? 0 : this.type.hashCode());
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AccessControlGroup other = (AccessControlGroup) obj;
// prevent infinity loops or other sick effects...
// if (!Objects.equal(this.inherits, other.inherits)) {
// return false;
// }
if (!Objects.equals(this.permissions, other.permissions)) {
return false;
}
if (!Objects.equals(this.type, other.type)) {
return false;
}
return true;
}
AccessControl:
#Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AccessControl other = (AccessControl) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
return true;
}
I'll lay odds that you modified group after adding it to the set groups. That would change its hashCode, which would leave it in the wrong bucket in groups, which would mean contains would not find it anymore unless the new hashCode happened to collide with the old one.
Set< AccessControlGroups > groups = new HashSet<>();
AccessControlGroup group = new AccessControlGroup();
groups.add( group );
groups.contains( group ); // true
group.setPermissions( new ArrayList<>() );
groups.contains( group ); // false

Weird behavior of Set.equals

I am encountering a weird behavior when trying to see if two sets are equal. I have overridden the equals and hashcode:
public class Metric {
private String id;
private Sensor sensor;
private String metricName;
private String metricDescription;
//getters, setters, toString()...
#Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((metricDescription == null) ? 0 : metricDescription.hashCode());
result = prime * result + ((metricName == null) ? 0 : metricName.hashCode());
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Metric other = (Metric) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (metricDescription == null) {
if (other.metricDescription != null)
return false;
} else if (!metricDescription.equals(other.metricDescription))
return false;
if (metricName == null) {
if (other.metricName != null)
return false;
} else if (!metricName.equals(other.metricName))
return false;
return true;
}
}
I have intentionally left the Sensor information out of the hashCode and equals, but in both so it should not make a difference.
Now, consider the following code:
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(datasource);
session.save(sensorType);
session.save(sensor);
session.save(metric1);
session.save(metric2);
session.getTransaction().commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
} finally {
if (session.isOpen())
session.close();
}
try {
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
sameSensor = (Sensor) session.get(Sensor.class, new String(sensor.getId()));
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
} finally {
if (session.isOpen())
session.close();
}
// simply retrieve the metrics
Set<Metric> sensorMetrics = sensor.getMetrics();
Set<Metric> sameSensorMetrics = sameSensor.getMetrics();
System.out.println("SENSOR METRIC");
for(Metric m : sensorMetrics) {
System.out.println(m.getMetricName() + ":" + m.hashCode());
System.out.println(sameSensorMetrics.contains(m));
}
System.out.println("SAME SENSOR METRIC");
for(Metric m : sameSensorMetrics) {
System.out.println(m.getMetricName() + ":" + m.hashCode());
System.out.println(sensorMetrics.contains(m));
}
The two sets should be identical (and all the hascodes are), but I am getting the following result:
SENSOR METRIC
metric2name_addSensor_1393695505000:-1437647480
true
metric1name_addSensor_1393695505000:2040143911
true
SAME SENSOR METRIC
metric1name_addSensor_1393695505000:2040143911
false
metric2name_addSensor_1393695505000:-1437647480
false
Even though the metrics are the same (I have checked the equals on all the pairs, the results are correct) the metrics are contained in one set but not the other... I really can't explain this and would appreciate any help.
I have given code snippets that I believe are the important ones, if any more information is needed I will be more than happy to provide. Thanks.
EDIT:
1) The code where Sensor is initialized as dfb requested:
/*
* Create all the sensor-related information to insert
*/
DataSource datasource = new DataSource();
datasource.setDatasourceName(
createUniqueString("datasource","addSensor"));
datasource.setDatasourceDescription(
createUniqueString("datasource","addSensor","description"));
SensorType sensorType = new SensorType();
sensorType.setSensorTypeName(
createUniqueString("sensortype","addSensor"));
sensorType.setSensorTypeDescription(
createUniqueString("sensortype","addSensor","description"));
Sensor sensor = new Sensor();
sensor.setDatasource(datasource);
sensor.setSensorType(sensorType);
sensor.setSensorName(createUniqueString("sensorname","addSensor"));
sensor.setSensorDescription(createUniqueString("sensordesc","addSensor","description"));
Metric metric1 = new Metric();
metric1.setMetricDescription(
createUniqueString("metric1name","addSensor","description"));
metric1.setMetricName(
createUniqueString("metric1name","addSensor"));
metric1.setSensor(sensor);
Metric metric2 = new Metric();
metric2.setMetricDescription(
createUniqueString("metric2name","addSensor","description"));
metric2.setMetricName(
createUniqueString("metric2name","addSensor"));
metric2.setSensor(sensor);
sensor.addMetric(metric1);
sensor.addMetric(metric2);
And the Sensor constructor:
Sensor() {
this.metrics = new HashSet<Metric>();
}
2) The weird behavior seems to be the Sensor instance that was saved, not the one that was loaded:
Set<Metric> sensorMetrics2 = sensor.getMetrics();
Set<Metric> sensorMetrics = sensor.getMetrics();
System.out.println(sensorMetrics2.equals(sensorMetrics));
System.out.println(sensorMetrics.equals(sensorMetrics));
Set<Metric> sameSensorMetrics2 = sameSensor.getMetrics();
Set<Metric> sameSensorMetrics = sameSensor.getMetrics();
System.out.println(sameSensorMetrics2.equals(sameSensorMetrics));
System.out.println(sameSensorMetrics.equals(sameSensorMetrics2));
The results:
false
false
true
true
Following construct is problematic with Hibernate, because hibernate tends to create proxies for entities because of need for lazy loading:
if (getClass() != obj.getClass())
return false;
Proxy is subclass of Metrics and thats why code above does not work, but code likely does:
if (!(obj instanceof Metrics)) {
return false;
}
More instructions about overriding equals and hashcode for entities can be found from Hibernate documentation. Also instanceof can bring surprises, as is told in this blog post.

New user held with searching array

I am trying to search an array and if the two Strings are matched then it will return true otherwise false, firstly i want to search to see if the account is already there if so then search Code if the two exsis then return true
public boolean searchArray(String account, String code) {
for (Accounts a : bAccounts) {
if (a.getAccount().equals(account)) {
for (Accounts c : bAccounts) {
if (c.getCode().equals(Code))
return true;
}
}
}
return false;
}
Think I've got a little lost within this search method, can anyone please help me on this, thanks. This all compiles fine but doesn't seem to return anything. I have get methods in my Accounts class which has get and set methods for Account and Sort.
public boolean searchArray(String account, String code) {
for (Accounts a : bAccounts) {
if (a.getAccount().equals(account)
&& a.getCode().equals(code)) {
return true;
}
}
return false;
}
Inner for should be removed.
You didn't mention if you'll accept nulls for account and code parameters.
If null values are possible/desirable to compare, this is what I suggest:
public boolean searchArray(String account, String code) {
for (Account a : accounts) {
if (account == null) {
if (code == null) {
if ((a.getAccount() == null) && (a.getCode() == null)) {
return true;
}
} else {
if ((a.getAccount() == null) && code.equals(a.getCode())) {
return true;
}
}
} else {
if (code == null) {
if (account.equals(a.getAccount()) && (a.getCode() == null)) {
return true;
}
} else {
if (account.equals(a.getAccount()) && code.equals(a.getCode())) {
return true;
}
}
}
}
return false;
}
If you won't consider nulls for account and code parameters, I suggest this:
public boolean searchArray(String account, String code) {
// if you won't consider nulls then there's no need to search
// when at least one of them is null
if ((account == null) || (code == null)) {
return false;
}
for (Account a : accounts) {
if (account.equals(a.getAccount()) && code.equals(a.getCode())) {
return true;
}
}
return false;
}
Hope it helps you

Why is listShuttle component in richFaces not getting updated?

I am a newbie for Richfaces components. When I am using the <rich:listShuttle>, the Arraylist specified in the targetValue is now getting updated with the latest data?
MyJSF File
<a4j:region>
<rich:listShuttle sourceValue="#{bean.selectItems}" id="one"
targetValue="#{bean.selectItemsone}" var="items" listsHeight="150"
sourceListWidth="130" targetListWidth="130"
sourceCaptionLabel="Intial Items"
targetCaptionLabel="Selected Items" converter="Listconverter">
<rich:column>
<h:outputText value="#{items.value}"></h:outputText>
</rich:column>
</rich:listShuttle>
</a4j:region>
<a4j:region>
<a4j:commandButton value="Submit" action="#{bean.action}" />
</a4j:region>
My Managed Bean
private List<String> selectedData;
private List<BeanItems> selectItems;
private List<BeanItems> selectItemsone;
public String action() {
System.out.println(selectItems);
System.out.println(selectItemsone);
System.out.println("Select Item List");
Iterator<BeanItems> iterator = selectItems.iterator();
while (iterator.hasNext()) {
BeanItems item = (BeanItems) iterator.next();
System.out.println(item.getValue());
}
System.out.println("/nSelect Item one list ");
Iterator<BeanItems> iterator2 = selectItemsone.iterator();
while (iterator2.hasNext()) {
BeanItems item = (BeanItems) iterator2.next();
System.out.println(item.getValue());
}
return "";
}
public void setSelectedData(List<String> selectedData) {
this.selectedData = selectedData;
}
public List<String> getSelectedData() {
return selectedData;
}
/**
* #return the selectItems
*/
public List<BeanItems> getSelectItems() {
if (selectItems == null) {
selectItems = new ArrayList<BeanItems>();
selectItems.add(new BeanItems("value4", "label4"));
selectItems.add(new BeanItems("value5", "label5"));
selectItems.add(new BeanItems("value6", "label6"));
selectItems.add(new BeanItems("value7", "label7"));
selectItems.add(new BeanItems("value8", "label8"));
selectItems.add(new BeanItems("value9", "label9"));
selectItems.add(new BeanItems("value10", "label10"));
}
return selectItems;
}
/**
* #return the selectItemsone
*/
public List<BeanItems> getSelectItemsone() {
if (selectItemsone == null) {
selectItemsone = new ArrayList<BeanItems>();
selectItemsone.add(new BeanItems("value1", "label1"));
selectItemsone.add(new BeanItems("value2", "label2"));
selectItemsone.add(new BeanItems("value3", "label3"));
}
return selectItemsone;
}
My Converter Class
public Object getAsObject(FacesContext context, UIComponent component,String value) {
int index = value.indexOf(':');
return new BeanItems(value.substring(0, index), value.substring(index + 1));
}
public String getAsString(FacesContext context, UIComponent component,Object value) {
BeanItems beanItems = (BeanItems) value;
return beanItems.getValue() + ":" + beanItems.getData();
}
My BeanItems Class
private String data; //Getter & setter
private String value; //Getter & setter
public BeanItems() {
}
public BeanItems(String value, String data) {
this.value = value;
this.data = data;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final BeanItems other = (BeanItems) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
If your question is that the target list is not getitng populated then i think you are supposed to override equals , hash code method for the wrapper object[BeanItem] since in the converter you are constructing new object every time in getAsObject method.
Also try putting a h:message tag wrapped in --a4j:outputPanel ajaxRendered="true"-- in your page to print any conversion errors that might be getting generated.

Categories