2010-12-03 5 views
6

ich ein Quellobjekt haben, das hat:Dozer Mapping HashMap <Key,Value> zur Liste <Value>

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

und ein Zielobjekt:

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

Ich versuche Dozer zu verwenden diese Zuordnung für mich zu tun aber ich bin irgendwie ratlos. Ich habe die Unit-Tests getestet und nur Dokumente, aber meine Herausforderung ist, dass ich nicht genau weiß, wonach ich suche.

Antwort

6

Im Allgemeinen genießt Dozer Mapping gerne zu mögen, vor allem soweit Datenstrukturen gehen. Dies macht Ihr Problem zu einem kniffligen Problem.

Zweifellos haben Sie auf Mapping java.util.Map zu java.util.Map gelesen. Das funktioniert gut, wenn Sie Maps an beiden Enden haben. Leider werden die Kartensatz-Methoden aller Könige und alle Könige Männer Ihnen wahrscheinlich nicht dabei helfen, eine Konvertierung von java.util.Map in java.util.List durchzuführen. Dozer möchte Map.get (Schlüssel) von der Quelle und Map.put (Schlüssel, Wert) in das Ziel eingeben. Da List das Put-Spiel nicht spielt, hast du einen Stau (ich konnte es nicht mit einem 'add()' vortäuschen ... vielleicht gibt es einen Weg?).

Am Ende der http://dozer.sourceforge.net/documentation/customconverter.html gibt es einen Abschnitt über "Datenstruktur Conversions", die Ihrem Problem zu ähneln scheint. Wenn die Antwort "schreibe ein benutzerdefiniertes Mapping" ist, bin ich wahrscheinlich keine große Hilfe, aber ich habe Ihren Code mit dem folgenden Setup arbeiten.

Hattest du etwas Glück mit dem Dozer 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

Eine melancholische Antwort; Ich hatte gehofft, dass es einen einfacheren Weg gibt - aber genau das habe ich getan. Ich frage mich, wie viele andere das Gleiche getan haben. – Idcmp

0

Haben Sie es versucht?

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

Es ist nicht klar, was Sie zu tun versuchen.

+1

Es ist speziell diese Zuordnung mit Dozer tun - http://dozer.sf.net/ – Idcmp

Verwandte Themen