将Dozer映射HashMap<Key,Value>到List<Value>

6
我有一个源对象,包含以下内容:
public class Source {
    public Map<String,DTO>getDTOs();
}

和目标对象:

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

我正在尝试使用Dozer来完成这个映射,但是我有些困惑。我已经进行了单元测试和文档方面的筛选,但我的挑战在于我不确定我在寻找什么。

2个回答

6
一般来说,Dozer 喜欢将类似的东西映射到类似的东西,特别是在数据结构方面。这使得你的问题变得棘手。
毫无疑问,您已经阅读了有关将 java.util.Map 映射到 java.util.Map 的内容。如果两端都有 Maps,则可以很好地工作。不幸的是,所有国王的“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的底部,有一个名为“Data Structure Conversions”的部分,看起来类似于您的问题。当答案是“编写自定义映射”时,我可能没有提供太大的帮助,但我通过以下设置使您的代码工作。
您是否已经尝试过在 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
一个忧郁的回答;我本来希望有一种更简单的方法 - 但最终我做的就是这样。我想知道还有多少人也是这么做的。 - Idcmp

0

你试过了吗?

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

不清楚你想要做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接