【问题标题】:Dozer Mapping HashMap<Key,Value> to List<Value>Dozer 映射 HashMap<Key,Value> 到 List<Value>
【发布时间】:2011-05-19 22:33:35
【问题描述】:

我有一个源对象:

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

和一个目标对象:

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

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

【问题讨论】:

    标签: java mapping dozer


    【解决方案1】:

    一般来说,Dozer 喜欢按喜好进行映射,尤其是在数据结构方面。这使您的问题变得棘手。

    毫无疑问,您已经阅读了有关将 java.util.Map 映射到 java.util.Map 的内容。如果您在两端都有地图,那确实很好用。不幸的是,所有的国王'map-set-method's 和所有的国王都不太可能帮助你进行 java.util.Map 到 java.util.List 的转换。 Dozer 想要从源 Map.get(key) 和 Map.put(key,value) 到目标。由于 List 不玩 put 游戏,所以你被卡住了(我无法使用 'add()' 成功伪造它......也许有办法?)。

    http://dozer.sourceforge.net/documentation/customconverter.html 的底部有一个关于“数据结构转换”的部分,这似乎与您的问题相似。当答案是“编写自定义映射”时,我可能帮不上忙,但我让您的代码可以使用以下设置。

    你有没有在推土机 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】:

    你试过了吗?

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

    不清楚你要做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多