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.