Bind de um HashMap num formulário HTML com SpringFramework
1 resposta
R
renatopbPJ
Daí gurizada,
Seguinte, fucei pelo fórum todo e não achei nada que pudesse ajudar.
Eis a minha situação:
Eu tenho uma classe que tem um atributo do tipo HashMap.
O que eu preciso:
Utilizar esse HashMap em um formulário pra depois alterar/salvar.
O que eu to utilizando:
Curto e grosso: Spring.
Mais detalhado, SimpleFormController e PropertyEditorSupport.
Onde to apanhando:
Não to sabendo como fazer o bind do HashMap com o formulário.
Até tive idéias de criar um combobox e vincular nele o valor como “key = value” pra ficar exibindo e tudo mais, só que o sofrimento tá na hora de fazer o bind.
Achei a solução, mas esqueci de postar.
Basicamente eu tive que extender a classe PropertyEdditorSupport e criar (copiar adaptando as classes) os métodos para utilizarem Map ao invés de Collection.
Não é a mais linda das classes, mas me serviu direitinho.
Abaixo segue o código.
importjava.beans.PropertyEditorSupport;importjava.lang.reflect.Array;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;importjava.util.StringTokenizer;importorg.hibernate.collection.PersistentMap;importorg.springframework.core.CollectionFactory;publicclassParameterMapEditorextendsPropertyEditorSupport{privatefinalClassmapType;publicParameterMapEditor(ClassmapType){if(mapType==null){thrownewIllegalArgumentException("Map type is required");}if(!Set.class.isAssignableFrom(mapType)){if(!Map.class.isAssignableFrom(mapType)){thrownewIllegalArgumentException("Map type ["+mapType.getName()+"] does not implement [java.util.Map]");}}this.mapType=mapType;}@SuppressWarnings("unchecked")publicvoidsetValue(Objectvalue){if(value==null){super.setValue(createMap(this.mapType,0));}elseif(this.mapType.isInstance(value)){super.setValue(value);}elseif(valueinstanceofPersistentMap){Mapsource=(PersistentMap)value;Maptarget=createMap(this.mapType,source.size());target.putAll((Map)convertElement(value));super.setValue(target);}elseif(valueinstanceofMap){Mapsource=(Map)value;Maptarget=createMap(this.mapType,source.size());target.putAll((Map)convertElement(source));super.setValue(target);}elseif(value.getClass().isArray()){Maptarget=(Map)convertElement(value);super.setValue(target);}else{Maptarget=createMap(this.mapType,1);MapconvertedSource=(Map)convertElement(value);target.putAll(convertedSource);super.setValue(target);}}protectedMapcreateMap(ClasscollectionType,intinitialCapacity){if(!collectionType.isInterface()){try{return(Map)collectionType.newInstance();}catch(Exceptionex){thrownewIllegalArgumentException("Could not instantiate map class ["+collectionType.getName()+"]: "+ex.getMessage());}}else{returnCollectionFactory.createLinkedMapIfPossible(initialCapacity);}}@SuppressWarnings("unchecked")protectedObjectconvertElement(Objectelement){Map<String,String>aux=newHashMap<String,String>(0);if(element.getClass().isArray()){inttamanhoLista;tamanhoLista=Array.getLength(element);aux=newHashMap<String,String>(tamanhoLista);StringTokenizerst;for(inti=0;i<tamanhoLista;i++){st=newStringTokenizer(String.valueOf(Array.get(element,i)),"#");aux.put(st.nextToken(),st.nextToken());}}elseif(elementinstanceofString){aux=newHashMap<String,String>(1);StringTokenizerst=newStringTokenizer((String)element,"#");aux.put(st.nextToken(),st.nextToken());}else{Class[]classes=element.getClass().getInterfaces();for(Classclass1:classes){if(class1.equals(Map.class)){aux.putAll((Map<String,String>)element);}}}returnaux;}publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{setValue(text);}publicStringgetAsText(){returnnull;}}