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;
}
}
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