2017-01-15 26 views
0

當通過第二個映射函數將映射信息明確地映射到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 - 方法這是更靈活。

現在,假設有一個新的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   Composed 
----   -------- 
- String a - String a 
       - Sub 
- String b  - String b 
- String c  - String c 
       - Sub2 
       - String d 
       - String e 

由於Flat沒有Sub2引用只是忽略它。不需要生成映射代碼。

+0

你的映射方法具有'Composed'作爲參數和'Flat'作爲目標;這是你實際上的意思,還是應該是相反的方式(如mapper類名所暗示的)? – Gunnar

+0

我添加了用例 – aliopi

+0

我修正了類名。我希望現在閱讀更好。 – aliopi

回答

1

可以簡單地壓平嵌套源結構,如下所示:

@Mapper 
public interface ComposedToFlatMapper { 

    @Mapping(target="b", source="sub.b") 
    @Mapping(target="c", source="sub.c") 
    Flat map(Composed c); 
} 
+0

是的,但這是一個冗餘信息。生成器應該看到'Sub'類型的映射並使用它。其他方面,我不需要'use ='配置。這很明顯,我不認爲你不能看到這一點。 – aliopi

+0

當Maptruct開始映射'Composed'類型並且看到'Sub'類型時,它必須使用/委託給來自'SubToFlatMapper'的方法'Flat map(Sub s)',否則Mapstruct的可組合模型會被破壞,我指定硬編碼映射。這最後一英里使它成爲天才恕我直言。 – aliopi

+0

這不是它的工作原理,我不確定你的建議可以實際工作。假設有'D'和'E'的Sub2和另一個使用的映射器'Sub2ToFlatMapper'。應該調用哪個方法,'subToFlat()'或'sub2ToFlat()'來獲得'Flat'從'composedToFlat()'返回的實例? – Gunnar