2017-09-19 6 views
0

、これはmapDetails方法があったので、それは、可能であった....MapStruct:入力オブジェクトを式に渡す方法は? MapStructバージョン1.1.0.Finalで

@Mappings({ 
    @Mapping(target = "transaction.process.details", expression = "java(MappingHelper.mapDetails(request))"), 
    //more mappings 
}) 
Response requestToResponse(Request request); 

可能であった(偶然?)requestToResponse方法に発生。だからrequestはnullではありません。

今、1.1.0.FinalがLombokで動作しなかったので、私は1.2.0.CR2にアップグレードしなければなりませんでした。このバージョンでは、mapDetailsは別のメソッドに生成されます。ここではrequestが渡されないため、requestはこのメソッド内でnullになり、式でNPEを取得します。

私は表現を誤ってしまったのですか?それだけでうまくいったのですか、新しいバージョンにはバグがありますか?バグがない場合は、requestインスタンスを式に正しく渡す必要がありますか?

答えて

2

あなたは表現を悪用しています。必要なのは、ターゲットをソースパラメーターにマップすることです。

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request"), 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 

MapStructは、次いで中間メソッドを作成し、MappingHelperを使用しmapDetailsメソッドを呼び出すべきです。多くのメソッドがRequestからdetailsにマップされている場合は、修飾されたマッピングを使用する必要があります(詳細はhereを参照)。

それはのようなものになります。

public class MappingHelper { 
    @Named("mapDetails") // or the better type safe one with the meta annotation @Qualifier 
    public static String mapDetails(Request request); 
} 

をそして、あなたのマッピングは次のようになります。

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request", qualifiedByName = "mapDetails"), //or better with the meta annotation @Qualifier qualifiedBy 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 
+0

おかげで、再び働く:) – Bevor

+0

をあなたは、このための良いテスト、ネストされたターゲットの特性を持っていることを確認します1.2.0で強化されており、正しく動作しない場合もあります(以前はバグでした) – Filip

関連する問題