私は修飾子を使用して非反復処理可能なマッピングを反復処理可能については、この例が見つかりました: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")
はい私は知っていますが、この解決策では、Iterableに含まれる特定のタイプごとにメソッドを実装する必要があります。私は最初の要素を取得し、ドット表記でこのタイプのフィールドにアクセスしたいと思います。 @Mapping(ターゲット= "EMAILADDRESS"、ソース= "emails.emailAddress"、qualifiedBy = FirstElement.class) も @Mapping(ターゲットは= "接頭辞": は、だから私はこのような何かを書きたいです、ソース=「phoneNumbers.prefix」、qualifiedBy = FirstElement.class)各プロパティのための方法を記述せず 私はこのようなマッパー書き込みたいたとえば – lincetto
にマッピング:=「EMAILADDRESS」 @Mapping(ターゲット、ソース= "emails [0] .emailAddress") – lincetto
あなたは正しいです。あなたがそれを行うことができるもう一つの方法があります。 '@ Maping'の' expression'属性を使うことができます。例えば、 '@Mapping(target =" emailaddress "、expression =" emails!= null &&!emails.isEmpty()?emails.get(0).getEmailAddress():null "}'。'emails'がマッピングメソッドの一部であれば' emails'を使うことができます。 'emails'がソースパラメータの属性であれば、' source.getEmails() 'を実行する必要があります。 – Filip