2010-12-03 3 views
6

J'ai un objet source qui a:Dozer Mapping HashMap <Key,Value> Liste <Value>

public class Source { 
    public Map<String,DTO>getDTOs(); 
} 

et un objet de destination:

public class Destination { 
    public List<DTO> getDTOs(); 
    public void setDTOs(List<DTO> dtos); 
} 

J'essaie d'utiliser Dozer pour faire ce mapping pour moi , mais je suis un peu perplexe. J'ai trié les tests unitaires et seulement les documents, mais mon défi est que je ne suis pas exactement sûr de ce que je cherche.

Répondre

6

En général, Dozer apprécie la cartographie comme aimer, surtout en ce qui concerne les structures de données. Cela rend votre problème délicat. Vous avez sans doute lu sur le mappage java.util.Map en java.util.Map. Cela fonctionne très bien si vous avez des cartes sur les deux extrémités. Malheureusement, tous les rois map-set-method et tous les rois mages ne vont probablement pas vous aider à faire une conversion de java.util.Map en java.util.List. Dozer veut Map.get (clé) de la source et Map.put (clé, valeur) dans la destination. Puisque List ne joue pas au put, vous êtes coincé (je n'ai pas réussi à faire croire à un 'add()' ... peut-être y a-t-il un moyen?).

Au bas de http://dozer.sourceforge.net/documentation/customconverter.html, il y a une section sur "Conversions de structure de données", qui semble ressembler à votre problème. Lorsque la réponse est "écrire un mappage personnalisé", je ne suis probablement pas d'une grande aide, mais j'ai obtenu votre code pour travailler avec la configuration suivante.

Avez-vous eu de la chance de faire tout cela dans le bulldozer xml?

<mapping> 
    <class-a>Source</class-a> 
    <class-b>Destination</class-b> 
    <field custom-converter="HashMapToListConverter"> 
     <a>dtos</a> <!-- This is a Map<String,DTO> --> 
     <b>dtos</b> <!-- This is a List<DTOPrime> --> 
     <a-hint>java.util.LinkedHashMap</a-hint> 
     <b-hint>java.util.ArrayList</b-hint> 
    </field> 
    </mapping> 



import org.dozer.*; 
import java.util.*; 

public class HashMapToListConverter extends DozerConverter<Map, List> implements MapperAware { 

    private Mapper mapper; 

    public HashMapToListConverter() { 
    super(Map.class, List.class); 
    } 

    public List convertTo(Map source, List destination) { 
    List<DTOPrime> convertedList = new ArrayList<DTOPrime>(); 
    for (Object object : source.values()) { 
     DTO item = (DTO)object; 
     DTOPrime mappedItem = mapper.map(item, DTOPrime.class); 
     convertedList.add(mappedItem); 
    } 
    return convertedList; 
    } 

    public Map convertFrom(List source, Map destination) { 
    Map<String, DTO> originalToMapped = new LinkedHashMap<String, DTO>(); 
    for (Object object : source) { 
     DTOPrime item = (DTOPrime)object; 
     DTO mappedItem = mapper.map(item, DTO.class); 
     originalToMapped.put(mappedItem.getData(), mappedItem); // FIXME: Since the mapping is lossy, you can decide what the keys of your map are for the reverse mapping... 
    } 
    return originalToMapped; 
    } 

    public void setMapper(Mapper mapper) { 
    this.mapper = mapper; 
    } 

} 
+2

Une réponse mélancolique; J'espérais qu'il y avait un moyen plus simple - mais c'est exactement ce que j'ai fini par faire. Je me demande combien d'autres ont fait la même chose. – Idcmp

0

Avez-vous essayé?

destination.setDTOs(new ArrayList<DTO>(source.getDTOs().values())); 

Vous ne savez pas exactement ce que vous essayez de faire.

+1

Il est fait spécifiquement cette mise en correspondance avec Dozer - http://dozer.sf.net/ – Idcmp

Questions connexes