6

次のソース オブジェクトがあります。

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

および宛先オブジェクト:

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

Dozer を使用してこのマッピングを実行しようとしていますが、ちょっと困惑しています。単体テストとドキュメントのみをトリアージしましたが、私の課題は、探しているものが正確にわからないことです。

4

2 に答える 2

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 はプット ゲームをプレイしないため、ジャムが発生します ('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;
  }

}
于 2010-12-20T02:50:45.480 に答える
0

やってみました?

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

あなたが何をしようとしているのかは明らかではありません。

于 2010-12-03T21:39:15.093 に答える