Dozer Mapping HashMapк списку <Value> - PullRequest
       4

Dozer Mapping HashMapк списку <Value>

6 голосов
/ 03 декабря 2010

У меня есть исходный объект, который имеет:

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

и целевой объект:

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

Я пытаюсь использовать Dozer, чтобы сделать это отображение для меня, но я в некотором роде озадачен. Я запустил модульные тесты и только документы, но моя проблема в том, что я не совсем уверен, что я ищу.

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010

В общем, Dozer любит отображение, как нравится, особенно когда речь идет о структурах данных. Это делает вашу проблему сложной.

Нет сомнений, что вы ознакомились с отображением java.util.Map на java.util.Map. Это отлично работает, если у вас есть Карты на обоих концах. К сожалению, все методы набора королей и все короли вряд ли помогут вам в преобразовании java.util.Map в java.util.List. Dozer хочет Map.get (ключ) из источника и Map.put (ключ, значение) в пункт назначения. Поскольку List не играет в игру «пут», вы застряли (я не смог успешно подделать его с помощью «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;
  }

}
0 голосов
/ 04 декабря 2010

Вы пробовали?

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

Не ясно, что вы пытаетесь сделать.

...