2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【MapStruct】コンストラクタ呼び出しでマップする/Kotlinのdata classへマップする

Last updated at Posted at 2021-01-30

MapStructは、1.4.0.Finalよりコンストラクタの呼び出しによるマッピングを正式にサポートしています。
この機能により、Kotlindata classへのマッピングもできるようになったため、実際にやってみます。

この記事では、MapStruct 1.4.1.Finalを利用します。

コード例

src/dst

例として、以下のsrcdstを行います。

ソース
data class Src(
    var arg0: Int,
    var arg1: Int,
    var arg2: Int,
    var arg3: Int,
    var arg4: Int
)
マップ対象
data class Dst(
    var arg0: Int,
    var arg1: Int,
    var arg2: Int,
    var arg3: Int,
    var arg4: Int
)

マッパー

マッパーの定義は以下の通りです。
injectionStrategy = InjectionStrategy.CONSTRUCTORを指定することで、コンストラクタ呼び出しができます。

import org.mapstruct.InjectionStrategy;
import org.mapstruct.Mapper;

@Mapper(injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface MapStructConstructorMapper {
    Dst map(Src src);
}

生成されたコード

生成されたコードは以下の通りです。
確かにコンストラクタが呼び出されています。

import javax.annotation.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-01-31T00:44:38+0900",
    comments = "version: 1.4.1.Final, compiler: IncrementalProcessingEnvironment from gradle-language-java-6.1.1.jar, environment: Java 1.8.0_241 (Oracle Corporation)"
)
public class MapStructConstructorMapperImpl implements MapStructConstructorMapper {

    @Override
    public Dst map(Src src) {
        if ( src == null ) {
            return null;
        }

        int arg0 = 0;
        int arg1 = 0;
        int arg2 = 0;
        int arg3 = 0;
        int arg4 = 0;

        arg0 = src.getArg0();
        arg1 = src.getArg1();
        arg2 = src.getArg2();
        arg3 = src.getArg3();
        arg4 = src.getArg4();

        Dst dst = new Dst( arg0, arg1, arg2, arg3, arg4 );

        return dst;
    }
}

呼び出し

以下のようにすることで、Kotlindata classへマッピングできます。

val src = Src(1, 2, 3, 4, 5)
val mapStructConstructor: MapStructConstructorMapper = Mappers.getMapper(MapStructConstructorMapper::class.java)
val dst = mapStructConstructor.map(src)

println(dst) // -> Dst(arg0=1, arg1=2, arg2=3, arg3=4, arg4=5)

補足

試した所、Kotlin no-arg pluginなどで無引数コンストラクタを生成している場合、injectionStrategy = InjectionStrategy.CONSTRUCTORを指定してもコンストラクタを呼び出すコードが生成されませんでした。

また、interfaceKotlinで書いた場合コード生成が機能しないようでした。
これに関しては、調べた所gradleの設定で回避できるかもしれませんでしたが、簡単のため一旦Javaで書いています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?