2017-08-04 13 views
0

OrderのエンティティをMapStructを使用してOrderDTOにマップしようとしています。新しいフィールドtotalOrderDTOに追加したい場合、このフィールドは元のエンティティOrderでは利用できません。Orderで利用可能な情報(注文エントリの価格、数量、税...)を使用して計算する必要があります。 私はOrderDTOに新しいフィールドtotalを作成し、私はマッパーのインターフェイスにデフォルトメソッドを追加することによって、それをマップしようとしている:MapStruct dtoに新しい計算フィールドを追加

public interface OrderMapper { 

    ... 

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

私はランチビルドがエラー

を起動MapStructときマッピングされていないターゲットプロパティ: "total"。

どのようにこの問題を解決するには?

ありがとうございました

答えて

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(); 
    } 
} 
関連する問題