3

Qualifier を使用した Iterable から Non-Iterable へのマッピングに関するこの例を見つけました。

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?

たとえば、次のようなマッピングを書くことを期待しています:

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

2 に答える 2

2

を変更するだけです。MapperUtils

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

基本的に、Annotated メソッドのパラメーターにはマップ元のIterableが必要であり、戻り値の型はNon-Iterableマップ先の である必要があります。

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

例えば:

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

ただし、式の使用を間違えると、コンパイル時に問題が発生する可能性があることに注意してください。MapStruct は式の有効性をチェックせず、そのまま使用します。

于 2016-12-05T21:46:12.917 に答える