2017-08-28 15 views
1

Mapstructを使用して、あるPOJOを別のPOJOにマッピングする定型コードを処理しています。ここでMapstructを使用してコレクションをマッピングし、逆も同様です。

はDTOです:ここでは

import java.util.Collection; 

public class TestTO { 
    String name; 
    Collection<AttributeTO> attributes; 
} 

は、マッピングされたPOJOです:

import java.util.Map; 

public class Test { 
    String name; 
    Map<String, Attribute> attributes; 
} 

私はMapCollectionの間のマッピングを処理するエレガントな方法を探しています。現在、私は@Mapping注釈のexpression属性を使用しています。 Attribute参照よりTest私はCycleBreakingContextを「サイクルを使ったマッピング」の例から使用しています。

@Mapping(target = "attributes", expression = "java(test.getAttributes().values().stream().map(a -> this.map(a, context)).collect(java.util.stream.Collectors.toList()))") 
abstract TestTO map(Test test, @Context CycleBreakingContext context); 

インタフェースも名mapAttributeTOする方法マッピングAttributeが含ま。

MapからCollectionへのこの変換をより洗練された方法で実装できますか?私のアプローチは機能していますが、それは欠点です。例えば、リファクタリングは、文字列内のコードフラグメントを認識しません。

答えて

2

デフォルトのマッパーメソッドはどうですか?あなたは、たとえば、特定の型をマップする方法についてMapStructを指示するデフォルトの実装を提供することができ、あなたのマッパーインターフェイスで

MapStructを地図からコレクションにマップしようとするたび、このメソッドが呼び出されます
default Collection<Integer> mapAttributes(Map<String, Integer> attributes) { 
    return attributes.values(); 
} 

自由にカスタマイズできます。

+0

これを私のインターフェイスに追加すると、コンパイル時に次のエラーが発生します。反復可能でない型から反復可能な型にマッピングメソッドを生成できません。 –

+0

これは奇妙なことですが、あなたは 'default'キーワードでそれを追加していますか? 'default'を使う代わりに、utilクラスと静的メソッドを持っていれば(あなたのマッピングがステートレスの場合) – Filip

+0

答えをありがとう!私はインターフェイスで間違って使用しました。私のせい...アプローチは正しい方法です。 –

関連する問題