2017-08-04 38 views
0

我試圖使用MapStruct將實體Order映射到OrderDTO。我想向OrderDTO添加一個新字段total,此字段在原始實體Order中不可用,並且應使用Order(訂單條目價格,數量,稅收...)中提供的信息計算。 我在OrderDTO創建一個新的領域total我試圖通過添加默認的方式映射器接口映射它:MapStruct將新的計算字段添加到dto

public interface OrderMapper { 

    ... 

    default BigDecimal orderToTotal(Order order){ 
     return logicToCalculateTotal(); 
    } 
} 

當我吃午飯構建MapStruct啓動錯誤

未映射的目標媒體資源:「全部」。

任何想法如何解決這個問題?

謝謝

回答

2

有多種方式可以實現你所需要的。第一種方法是使用@AfterMapping@BeforeMapping。如果您使用此代碼去看起來像:

public interface OrderMapper { 

    @Mapping(target = "total", ignore = true) // Needed so the warning does not shown, it is mapped in calculateTotal 
    OrderDto map(Order order); 

    @AfterMapping // or @BeforeMapping 
    default void calculateTotal(Order order, @MappingTarget OrderDto dto) { 
     dto.setTotal(logicToCalculateTotal()); 
    } 
} 

另一種方法是做像你開始,但你不得不說,totalOrder映射。

你的替代方法映射是:

public interface OrderMapper { 

    @Mapping(target = "total", source = "order")// the source should be equal to the property name 
    OrderDto map(Order order); 

    default BigDecimal orderToTotal(Order order) { 
     return logicToCalculateTotal(); 
    } 
}