4

クラスBのネストされたセットを持つクラスAがあります。

public class A {
    private Set<B> children;
}

public class B {
    private int value;
}

クラスDのネストされたセットを持つクラスCもあります。

public class C {
    private Set<D> children;
}

public class D {
    private int value;
}

Aのリストが与えられたら、どうすればそれをCのリストに変換できますか?ジェネリックを使用しているので、理想的にはマッピングのヒントを提供する必要はありません。例えば:

List<A> src = new ArrayList<A>();
// ----- Add some A's to src -----
List<C> dst = mapper.map(src, List<C>.class);

明らかに、最後の行の構文は正しくありません。それはどうあるべきですか?また、作成するリストまたはセットのタイプをDozerに指示するにはどうすればよいですか?

ありがとう。

ナレシュ

4

2 に答える 2

4

これは実際にはFAQで回答されていますが、何らかの理由で高度なセクションでずっと下になっています. これは高度なトピックではないと思います。やりたいことはよくあることだと思います。 コレクションのヒントでそれを行います。

コレクションをマッピングするとき、目的のコレクションに必要なデータ オブジェクトのタイプを Dozer に伝えるにはどうすればよいですか?

このユースケースを処理するために、ヒントがサポートされています。JDK 1.5 Generics を使用している場合、型は Dozer によって自動検出されるため、ヒントは必要ありません。ただし、ジェネリックを使用していない場合は、コレクション/配列を異なるタイプのオブジェクトを持つコレクション/配列に変換するために、ヒントを指定して、宛先リストに作成するオブジェクトのタイプを Dozer に知らせることができます。送信先フィールドにヒントが指定されていない場合、送信先コレクションには、src コレクションの要素と同じタイプのオブジェクトが入力されます。

<field>
  <a>someList</a>
  <b>otherList</b> 
  <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> 
</field>

その答えは、xmlでそれを行う方法を示しています。マッピングを使用してJavaコードで行う方法は次のとおりです。

import org.dozer.loader.api.BeanMappingBuilder;

import static org.dozer.loader.api.FieldsMappingOptions.hintB;

public class Mapping extends BeanMappingBuilder {
    @Override
    protected void configure() {
        mapping(Subject.class, JsonSubject.class)
                .fields("names", "names", hintB(JsonName.class));
    }
}

ヒントは dozer に「この A のリストを JsonName インスタンスのリストに変換する必要があります」と伝えます。このマッピングをマッパーに追加する方法は次のとおりです。

    mapper = new DozerBeanMapper();
    mapper.addMapping(new Mapping());
于 2013-05-07T00:10:00.607 に答える
0

このリスト変換を展開するだけです。Dozer は、コレクションではなく、JavaBeans などのオブジェクトを変換します。したがって、コレクションを渡したい場合は、次のようなラッパーを作成できます

public class EntityConverter {
    private Mapper mapper;

    public EntityConverter(Mapper mapper) {
        this.mapper = mapper;
    }

    public <F, T> List<T> convert(List<F> fromList, final Class<T> toClass) {
        return Lists.transform(fromList, new Function<F, T>() {
            @Override
            public T apply(F from) {
                return convert(from, toClass);
            }
        });
    }

    public <F, T> T convert(F from, final Class<T> toClass) {
        if (from == null) return null;
        return mapper.map(from, toClass);
    }
}

注: このコードは Guava を使用しています。

于 2013-01-11T00:25:48.450 に答える