2017-06-02 7 views
1

私のコンテキストは次のとおりです。外部構成に基づいてオブジェクトを別のオブジェクトに変換するクラスを動的に生成するために使用しています。私はいくつかの問題に遭遇し、MapStructをどのように発見したかの代替案を探したかったのです。MapStruct:マッピングマッチングをカスタマイズしてカスタムマッパーを定義する

単純なマッパーを作成しようとしましたが、アノテーションをカスタマイズして変換関数を追加する可能性があるかどうかを知りたかったのです。たとえば、私が持っているしたいと思います:

@Mapping(
    source = "mySourceField", 
    sourceType = "String", 
    target = "myTargetField", 
    targetType = "Integer", 
    transformation = {"toInteger", "toSquare"} 
), 

そしてマッパーの実装に私のようなものだろう:誰かが私は感謝されることを達成するために私を助けることができますし、それが私を救う希望の場合

public TypeDest toSiteCatTag(TypeSrc obj) { 

    if (obj == null) { 

     return null; 
    } 

    TypeDest objDest = new TypeDest(); 

    objDest.myTargetField = Formatter.toSquare(
     Formatter.toInteger(obj.mySourceField)); 

    return objDest; 
} 

を多くの時間。

ありがとうございます。

+0

コンパイル時に 'TypeDest'と' TypeSrc'を持っていますか、それとも動的クラスですか?実行時にそれらを生成しますか? – Filip

答えて

2

TypeDestおよびTypeSrcが実行時に生成されない場合、つまりコンパイルされたクラスである場合は、必要なものを達成できます。 MapStructは注釈プロセッサーであり、Javaコードを生成するため、実行時には機能しません。存在しないフィールドをマップしようとしたり、あいまいなマッピング方法があるような問題がある場合は、コンパイル時にエラーが発生します。

それは次のようになります。マッパーのカスタムメソッドなしでそれを行う方法があり

@Mapper 
public interface MyMapper { 

    @Mapping(source = "mySourceField", target = "myTargetField", qualifiedByName = "myTransformation")// or you can use a custom @Qualifier annotation with qualifiedBy 
    TypeDest toSiteCatTag(TypeSrc obj); 

    @Named("myTransformation")// or your custom @Qualifier annotation 
    default Integer myCustomTransformation(String obj) { 
     return Formatter.toSquare(Formatter.toInteger(obj)); 
    } 
} 

をしていますが、toInteger、その後toSquare変換を適用どこかの方法を持っている必要があります。 Formatterに署名Integer squaredString(String obj)のメソッドがある場合。

@Qualifier 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.CLASS) 
public @interface SquaredString {} 

public class Formatter { 

    @SquaredString// you can also use @Named, this is just as an example 
    public static Integer squaredString(String obj) { 
     return toSquare(toInteger(obj)); 
    } 
    //your other methods are here as well 
} 

次に、あなたのマッパーでこれを行うことができます。

@Mapper(uses = { Formatter.class }) 
public interface MyMapper { 

    @Mapping(source = "mySourceField", target = "myTargetField", qualifiedBy = SquaredString.class) 
    TypeDest toSiteCatTag(TypeSrc obj); 
} 

例は上記のみqualifedByName/qualifiedが使用されているので、特定のマッピングに適用されます。 StringIntegerに変換する別の方法を使用する場合は、MapperまたはMapper#usesのクラスの一部で、Integer convertString(String obj)という名前のメソッドを定義できます。 MapStructはStringからIntegerへの変換をこのメソッドに委譲します。

マッピングの詳細については、リファレンスドキュメントの修飾子hereと、マッピング方法の詳細についてはhereを参照してください。

+0

完璧に見えます。ありがとう、あなたは私に多くの時間を節約:) – nbchn

関連する問題