selectonemenu jsf on objects with converter
23,892
I have the solution. I had to override the "equals" method in MyObject class!
Thanks.
EDIT: the code
@Override
public boolean equals(Object obj) {
if(this.id == ((MyObject) obj).id) {
return true;
}else {
return false;
}
}
Author by
Loric
Updated on July 05, 2022Comments
-
Loric almost 2 years
Here is my SelectOneMenu
<h:selectOneMenu value="#{bean.myObject}" > <f:ajax render="componentToRender" listener="#{bean.onSelect}"/> <f:converter converterId="myObjectConverter" /> <f:selectItem itemLabel="None" itemValue="#{null}" /> <f:selectItems value="#{bean.objects}" var="object" itemValue="#{object}" itemLabel="#{object.name}" /> </h:selectOneMenu>
And my converter
@FacesConverter("myObjectConverter") public class MyObjectConverter implements Converter{ private List<MyObject> objects; public MyObjectConverter(){ this.objects = MyController.getAllMyObjects(); } public Object getAsObject(FacesContext context, UIComponent component, String value) { if(!StringUtils.isInteger(value)) { return null; } return this.getMyObject(value); } public String getAsString(FacesContext context, UIComponent component, Object value) { if(value == null) { return null; } return String.valueOf(((MyObject) value).getId()).toString(); } public MyObject getMyObject(String id) { Iterator<MyObject > iterator = this.objects.iterator(); while(iterator.hasNext()) { MyObject object = iterator.next(); if(object.getId() == Integer.valueOf(id).intValue()) { return object; } } return null; } }
The problem is that my ajax listener is never called and my component never rendered. Is there something wrong with my converter or selectOneMenu? I follow an example and I can't figure the mistake out.
BTW : my simple method in the bean
public void onSelect() { System.out.println(this.myObject); if(this.myObject != null) { System.out.println(this.myObject.getName()); } }
I already had a problem like this and I changed my selected value from object to id. But here I want to make it work with objects because I know it's possible.
Thanks