推土机将HashMap <Key,Value>映射到List <Value>

Idc*_*cmp 6 java mapping dozer

我有一个源对象,它具有:

public class Source {
    public Map<String,DTO>getDTOs();
}
Run Code Online (Sandbox Code Playgroud)

和目标对象:

public class Destination {
    public List<DTO> getDTOs();
    public void setDTOs(List<DTO> dtos);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Dozer为我做这个映射,但我有点难过.我对单元测试和文档进行了分类,但我的挑战是我不确定我在寻找什么.

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

}
Run Code Online (Sandbox Code Playgroud)

  • 一个忧郁的回答; 我希望有一种更简单的方法 - 但这正是我最后做的事情.我想知道有多少人做过同样的事. (2认同)