Converters are not called by selectOneMenu validation
luxspes Sep 18, 2008 4:14 PMI am having problems biding a selectOneMenu to a List<Map<String,Object>> if I write this (I started a new thread because I think this is a different problem):
<h:selectOneMenu name="selectName" value="#{controller.mapProperty['key']}" >
<s:selectItems value="#{controller.sourceList}" var="item" label="#{item['label']}"/>
</h:selectOneMenu>
I am getting a string (Map.toString()) in #{controller.mapProperty['key']} instead of a Map. So I decided to write a converter:
@Name("mapConverter")
@Converter(forClass=java.util.Map.class)
public class MapConverter implements javax.faces.convert.Converter, Serializable {
@Logger
Log log;
private List<javax.faces.model.SelectItem> getItems(UIComponent component){
UISelectOne selectOne = (UISelectOne)component;
UISelectItems selectItems = (UISelectItems) selectOne.getChildren().get(0);
List<SelectItem> items = (List<SelectItem>) selectItems.getValue();
log.info("Component #0 children #1 values #2 first #3",component,selectOne.getChildren(),items,items.get(0).getValue());
return items;
}
private List<Map> getMaps(UIComponent component){
List<SelectItem> items = getItems(component);
List<Map> maps = new ArrayList<Map>();
for(SelectItem item:items){
Map mapToAdd = (Map) item.getValue();
log.info("Map to add #0",mapToAdd);
maps.add(mapToAdd);
}
return maps;
}
private Map findMap(UIComponent component,String value){
List<Map> maps = getMaps(component);
for(Map map:maps){
if(map.get("value").toString().equals(value))
return map;
}
log.info("Not found #0 in #1",value,maps);
return null;
}
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Map object = findMap(component,value);
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
// TODO Auto-generated method stub
if(value instanceof Map){
Map map = (Map) value;
String string = map.get("value").toString();
log.info("Map #0 a #1", map,string);
return string;
}
throw new ConverterException("Unexpected class:"+value.getClass());
}
}
I know it is a very naive implementation (it assumes a value key in the map) but it should work... well it does not. It crashes. And I think it is because of a bug inside selectOneMenu. I'll write about it in my next post.