マッピング情報がMapstructに第2のマッピング関数によって明示的に与えられている場合、これが自動的にマッピングコードを生成しないのはなぜですか?mapstructを使用してフラットオブジェクトを合成オブジェクトにマップ
Flat Composed
---- --------
- String a - String a
- Sub
- String b - String b
- String c - String c
。明確にするために
@Mapper(uses = SubToFlatMapper.class)
public interface ComposedToFlatMapper {
Flat map(Composed c); // Unmapped target properties: "b, c".
// Not OK because Sub mapping is defined in
// SubToFlatMapper and is used here :(
}
@Mapper
public interface SubToFlatMapper {
Flat map(Sub s); // Unmapped target properties: "a".
// (OK because 'a' is not in Sub)
}
使用方法:生成コードは、そのための方法を作成していないため
Composed composed = new Composed();
Sub sub = new Sub();
composed.setA("A");
composed.setSub(sub);
sub.setB("B");
sub.setC("C");
Flat flat = ComposedToFlatMapper.INSTANCE.map(composed);
// flat.getA() is "A", OK!
// flat.getB() is null, unexpected, should be "B"
// flat.getC() also null, should be "C".
"B"
と"C"
がflat
にマッピングされていません。
私はジェネレータに必要なマッピング情報を提供していると思いました。 Flat map(Sub s)
メソッドを参照すると、内部にComposedToFlatMapperImpl
が生成されます。
編集:
私はこの前に言及しなかったが、元の質問に、私はまた、より柔軟性のあるupdate
-methodsを使用することができます。
今、新しいSub2
タイプがあると仮定します。 :
@Mapper(uses = {SubToFlatMapper.class, Sub2ToFlatMapper.class})
public interface ComposedToFlatMapper {
Flat map(Composed c);
void update(Composed source, @MappingTarget Flat target);
}
@Mapper
public interface SubToFlatMapper {
Flat map(Sub s);
void update(Sub source, @MappingTarget Flat target);
}
@Mapper
public interface Sub2ToFlatMapper {
Flat map(Sub2 s);
void update(Sub2 source, @MappingTarget Flat target);
}
。 Flat
以来
Flat Composed
---- --------
- String a - String a
- Sub
- String b - String b
- String c - String c
- Sub2
- String d
- String e
はそれを無視して何のSub2
の参照を持っていません。マッピングコードを生成する必要はありません。
あなたのマッピング方法は、ターゲットとして、パラメータと 'Flat'として' Composed'を持っています。それはあなたが実際に意図していたものなのでしょうか、それとも逆のものでなければなりませんか(マッパークラス名が暗示しているように)? – Gunnar
ユースケースを追加しました – aliopi
クラス名を修正しました。私は今読んでおくほうがいいと思う。 – aliopi