2017-11-30 7 views
0

MapStructを使用して2つのオブジェクトをマッピングしようとしています。私はしばらく検索していましたが、何かを見つけることができませんでしたが、プログラミングに慣れていないので、私が作っているよりも簡単だと確信しています。MapStruct arrayListからの取り出し

SourceObject:ここ

は、いくつかのバック剥奪コード(それがここにあるよう宛先が子変数をオブジェクトとしてのArrayListから子オブジェクトが同じ型でないと、実際のコードが複雑であることに注意してください)です

public class SourceObject { 
    public ArrayList<ListObject> list = new ArrayList<ListObject>(); 

    public SourceObject() { 
     list.add(new ListObject()); 
    } 
} 

ListObject

public class ListObject { 
    public DetailsObject details = new DetailsObject(); 

    public ListObject() { 
     details.forename="SourceForename"; 
     details.surname="SourceSurname"; 
    } 
} 

DestinationObject

public class DestinationObject { 
    public DetailsObject details = new DetailsObject(); 

    public DestinationObject() { 
     details.forename="DestinationForename"; 
     details.surname="DestinationSurname"; 
    } 
} 

DetailsObject

public class DetailsObject { 
    public String forename; 
    public String surname; 
} 

これは私が直接SourceObject内DetailsObjectを置く場合は正常に動作しますが、私がしようとすると問題になるだろう

@Mappings({ 
    @Mapping(target="details.forename", source="list.get(0).details.forename"), 
    @Mapping(target="details.surname", source="list.get(0).details.surname"), 
}) 
DestinationObject toDestination(SourceObject source); 

マッパーそれをtから取る彼はリストする。

[エラー]目標org.apache.maven.plugins:maven-compiler-pluginを実行できませんでした:3.5.1:プロジェクトテンプレートでコンパイル(デフォルトコンパイル):コンパイルエラー:コンパイルエラー:

は[ERROR] .../srcに/メイン/ javaの/マッパー/ SourceToDestinationMap.java:[12,13]という名前のプロパティ "list.get(0).details.surnameは、" ソースパラメータ(S内に存在します)。あなたは "list.empty"を意味しましたか?

[ERROR] .../src/main/java/Mapper/SourceToDestinationMap.java:[11,9]ソースパラメータに "list.get(0).details.forename"という名前のプロパティが存在しません。 。あなたは "list.empty"を意味しましたか?

EDIT:マッパーの現在の状態:

@Mapper 
public interface SourceToDestinationMap { 

    @Mapping(target = "details", source = "list") 
    DestinationObject toDestination(SourceObject source); 

    default DetailsObject map(List<ListObject> source) { 
     return map(source.get(0)); 
    } 

    DetailsObject map(ListObject source); 
} 
+1

完全なマッパーコードと受け取ったコンパイルエラーを提供してください – saw303

+0

あなたのマッピングコードが間違っています。具体的には、クラスのコードとマップしようとしているコードとが一致しません。 – Filip

+0

申し訳ありませんが、私は誰かが簡単にarraylistから得る方法の方向に私を指し示すだろうと思って、それが共通の課題であると期待していました。私のプロジェクトからすべての詳細を取り出そうとするのではなく、私がやろうとしていることを示す簡単なプロジェクトを作成しました。これを反映するために最初の投稿を更新しました。うまくいけばそれは役に立ちます:) –

答えて

0

あなたがやろうとしているマッピングが可能ではない、あなたがBeanプロパティと豆の機能を混合しています。

@Mapping(source = "list.get(0).XXX")は使用できません。索引を使用してリストの要素にアクセスする方法はまだサポートされていません#1321を参照してください。

問題を解決する方法は、mapstruct-iterable-to-non-iterableの例で使用されているのと同じ方法で修飾子を使用することです。

また、マッピングを実行する独自の方法を提供することもできます。

@Mapper 
pubic interface MyMapper { 

    @Mapping(target = "details", source = "list") 
    DestinationObject toDestination(SourceObject source); 

    default DetailsObject map(List<ListObject> source) { 
     return source != null && !source.isEmpty() ? map(source.get(0)) : null; 
    } 

    DetailsObject map(ListObject source); 
} 

MapStructが正しいコードを生成します。

もう1つの方法は@Mapping(expression="java()"です。expressionため

@Mapper 
public interface MyMapper { 

    @Mapping(target = "details.forename", expression = "java(source.list.get(0).details.forename)") 
    @Mapping(target = "details.surname", expression = "java(source.list.get(0).details.surname)") 
    DestinationObject toDestination(SourceObject source); 
} 

注:

あなたのマッパーは、次のようになります。 MapStructは式のテキストをそのまま使用し、妥当性チェックを実行しません。したがって、nullと空のチェックがないため、少し脆くなることがあります。

+0

あなたの助けてくれてありがとう!私自身の方法を提供することは、それを行うための最善の方法と思われます。私は行に問題があります return source!= null &&!source.isEmpty():map(source.get(0)):null; 次のように:構文エラーをスローします。なぜこれがあるのか​​知っていますか? –

+0

構文エラーがありました。 ':'は '?'でなければなりません。また、適切と思われる方法で実装することもできます。これは単なる例です。 – Filip

+0

ありがとうございました。以前はJavaの三項式に遭遇していませんでした。私のコードを単純にするために、私はreturn map(source.get(0))を使うつもりです。今のところ、検証を後で追加することができます。今はコンパイルされますが、期待されるtmpForenameではなくマッピング後にdest.details.forename変数にnullが格納され、surname変数にもnullが格納されるため、テストは失敗します。 –

関連する問題