2017-12-07 19 views
2

マッピングメソッドに3つのパラメータがあり、3つすべてがターゲットタイプのプロパティの1つを取得する際に使用されている状況があります。複数のパラメータを持つMapStruct QualifiedByName

私はこのメソッドを呼び出すためのプロパティを取得するためのロジックを保持したままインターフェイスにデフォルトのマッピングメソッドを作成しましたが、@Mapping注釈でexpression = "java(/*method call here*/)"を使用できます。

mapstruct注釈のような@qualifiedByNameのいずれかと、私は表現性を有する注釈をコメントしようとしたqualifiedByNameを使用し、これを行うにはどのような方法がありますが、それは動作しません:

@Mapper 
public interface OneMapper { 

    @Mapping(target="id", source="one.id") 
    //@Mapping(target="qualified",expression = "java(checkQualified (one, projId, code))") 
    @Mapping(target="qualified",qualifiedByName="checkQualifiedNamed") 
    OneDto createOne (One one, Integer projId, Integer val, String code); 

    @Named("checkQualifiedNamed") 
    default Boolean checkQualified (One one, Integer projId, Integer val, String code) { 
     if(one.getProjectId() == projId && one.getVal() == val && one.getCode().equalsIgnoreCase(code)) { 
      return Boolean.TRUE; 
     } 
     return Boolean.FALSE;     
    } 
} 

答えて

2

現在MapStructにはありません複数のソースプロパティを持つマッピングメソッドをサポートします。

ただし、あなたのケースでは、@Contextを1.2.0から使用できます。私が理解しているところでは、projIdcodeはマッピングのヘルパーとして存在し、ターゲットプロパティのマッピングには使用されません。

は、だからあなたは(それは理論的には動作するはず)のような何かを行うことができます:

@Mapper 
public interface OneMapper { 

    @Mapping(target="id", source="one.id") 
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed") 
    OneDto createOne (One one, @Context Integer projId, @Context String code); 

    @Named("checkQualifiedNamed") 
    default Boolean checkQualified (One one, @Context Integer projId, @Context String code) { 
     if(one.getProjectId() == projId && one.getCode().equalsIgnoreCase(code)) { 
      return Boolean.TRUE; 
     } 
     return Boolean.FALSE;     
    } 
} 

別の方法としては、別々のクラスにこれらすべてのプロパティを抽出し、一緒に(これは、複数のパラメータを可能にすることを渡すことであろう同じタイプ)。

クラスは次のようになります、mapper.createOne(one, new Filter(projId, val, code));

+0

入力のおかげで@Filip:あなたは、その後のようなマッパーを呼び出すことができます

@Mapper public interface OneMapper { @Mapping(target="id", source="one.id") @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed") OneDto createOne (One one, @Context Filter filter); @Named("checkQualifiedNamed") default Boolean checkQualified (One one, @Context Filter filter) { if(one.getProjectId() == filter.getProjId() && one.getVal() == filter.getVal() && one.getCode().equalsIgnoreCase(filter.getCode())) { return Boolean.TRUE; } return Boolean.FALSE; } } 

:あなたのマッパーは、次にようになります

public class Filter { private final Integer projId; private final Integer val; private final String code; public Filter (Integer projId, Integer val, String code) { this.projId = projId; this.val = val; this.code = code; } //getters } 

これは私が必要とするものに非常に近いようですが、私がここに直面しているもう一つの問題があります。実際のプロジェクトには、4つのパラメータ、1つのエンティティオブジェクトと3つのサポートプロパティ、3つのsup portingプロパティがIntegerであり、同じタイプの複数のコンテキストが存在しない場合、Contextとしてエンティティを作成し、Integerの1つをソースとして保持しようとしましたが、エンティティ内の他のすべての属性を無視します。 私はあなたのために何かを提案できる場合、私の質問でコードスニペットを更新しましたか? –

+0

私は答えを更新しました。基本的には、すべてのプロパティを '@ Context'を表すラッパークラスに置き換えることができます。それははるかに強力で、あなたは物事を実行することができます。 [渡すコンテキスト/状態オブジェクト]のドキュメントを見てください(http://mapstruct.org/documentation/stable/reference/html/#passing-context) – Filip

+0

私のアプリケーションでは、フィルタ目的のための新しいクラスを定義することができますしかし、私は実現可能性をチェックし、Expressionを使用するかFilerを定義するかのどちらかを決定します。あなたの努力と時間をありがとう。 –

関連する問題