我有一个源对象:
public class Source {
public Map<String,DTO>getDTOs();
}
和目标对象:
public class Destination {
public List<DTO> getDTOs();
public void setDTOs(List<DTO> dtos);
}
我正在尝试使用Dozer为我做这个映射,但我有点难过。我对单元测试和文档进行了分类,但我的挑战是我不确定我在寻找什么。
答案 0 :(得分:6)
一般来说,Dozer喜欢映射喜欢,特别是就数据结构而言。这使你的问题变得棘手。
毫无疑问,您已经阅读了将java.util.Map映射到java.util.Map的内容。如果你有两端的地图,这确实很有用。不幸的是,所有国王的map-set-method和所有的国王都不太可能帮助你做java.util.Map到java.util.List的转换。 Dozer希望从源代码Map.get(key)和Map.put(key,value)到目标。由于List没有玩put游戏,你被卡住了(我无法用'add()'成功伪装它......也许有办法?)。
在http://dozer.sourceforge.net/documentation/customconverter.html的底部有一个关于“数据结构转换”的部分,它似乎与您的问题类似。当答案是“编写自定义映射”时,我可能不是一个很好的帮助,但我让你的代码使用以下设置。
你是否有幸在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;
}
}
答案 1 :(得分:0)
你试过吗?
destination.setDTOs(new ArrayList<DTO>(source.getDTOs().values()));
目前尚不清楚你要做什么。