2016-12-05 20 views
1

私は修飾子を使用して非反復処理可能なマッピングを反復処理可能については、この例が見つかりました:MapStruct:ネストされたIterableからNonterterableへのマッピングですか?

https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable

しかし、(ドットのアノテーションを使用して)ネストされたプロパティをマップするために、このマッピングができるようにする方法?

など。ソースオブジェクトのコレクションの最初の要素のフィールドxyzをターゲットオブジェクトのプレーンフィールドにマッピングしますか?

例は

@Qualifier 
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.SOURCE) 
public @interface FirstElement { 
} 

[カスタムマッパー

public class MapperUtils { 
    @FirstElement 
    public <T> T first(List<T> in) { 
     if (in != null && !in.isEmpty()) { 
      return in.get(0); 
     } 
     else { 
      return null; 
     } 
    } 
} 

とを定義する修飾子を定義し、最終的には、マッピングが

@Mapping(target = "emailaddress", source = "emails", qualifiedBy = FirstElement.class) 

として定義されている。しかし、私はしたい場合電子メールコレクションの最初の要素から特定のフィールド、例えば私はコードemails.get(0).getEmailAddressでやったでしょうか?

例えば、私はこのようなマッピングを記述することを期待:あなたはちょうどMapperUtils

public class MapperUtils { 
    @FirstElement 
    public String firstEmailAddress(List<Person> in) { 
     if (in != null && !in.isEmpty()) { 
      return in.get(0).getEmailAddress(); 
     } 
     else { 
      return null; 
     } 
    } 
} 

を変更する必要が

@Mapping(target = "emailaddress", source = "emails[0].emailAddress") 

答えて

2

基本的には注釈付きメソッドのパラメータは、あなたIterableを持っている必要がありますからマップしたい戻り値の型は、マップしたいNon-Iterableでなければなりません。

マッピングのカスタムマッピングを作成しない場合は、expression属性を使用することもできます。例えば

@Mapping(target = "emailaddress", expression = "emails != null && !emails.isEmpty() ? emails.get(0).getEmailAddress() : null") 

しかし、式を使用して入力を間違えた場合は、時間の問題をコンパイルするために導くことができるように注意してください。 MapStructは式の妥当性をチェックせず、そのまま使用します。

+0

はい私は知っていますが、この解決策では、Iterableに含まれる特定のタイプごとにメソッドを実装する必要があります。私は最初の要素を取得し、ドット表記でこのタイプのフィールドにアクセスしたいと思います。 @Mapping(ターゲット= "EMAILADDRESS"、ソース= "emails.emailAddress"、qualifiedBy = FirstElement.class) も @Mapping(ターゲットは= "接頭辞": は、だから私はこのような何かを書きたいです、ソース=「phoneNumbers.prefix」、qualifiedBy = FirstElement.class)各プロパティのための方法を記述せず 私はこのようなマッパー書き込みたいたとえば – lincetto

+0

にマッピング:=「EMAILADDRESS」 @Mapping(ターゲット、ソース= "emails [0] .emailAddress") – lincetto

+0

あなたは正しいです。あなたがそれを行うことができるもう一つの方法があります。 '@ Maping'の' expression'属性を使うことができます。例えば、 '@Mapping(target =" emailaddress "、expression =" emails!= null &&!emails.isEmpty()?emails.get(0).getEmailAddress():null "}'。'emails'がマッピングメソッドの一部であれば' emails'を使うことができます。 'emails'がソースパラメータの属性であれば、' source.getEmails() 'を実行する必要があります。 – Filip

関連する問題