weblog@kentama

技術的なメモ置き場。主にJava。

【MapStruct】コンポーネントモデルを指定する

Mapperのコンポーネントモデルを指定することができる。
今回はSpring FrameworkでDIできるようにする。

環境

  • MapStruct : 1.2.0.Final
  • Java : 9
  • JUnit : 4.12
  • AssertJ : 3.9.1

@Mapper のcomponentModel属性を使う

@Mapper のcomponentModel属性に spring を指定する。

@Mapper(componentModel = "spring")
public interface SpringMapper {
    Person toPerson(PersonEntity entity);
}

これでMapperを生成すると @Component が付与されたMapperが生成される。

import org.springframework.stereotype.Component;

/*
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2018-03-07T22:13:08+0900",
    comments = "version: 1.2.0.Final, compiler: javac, environment: Java 9.0.1 (Oracle Corporation)"
)
*/
@Component
public class SpringMapperImpl implements SpringMapper {

    @Override
    public Person toPerson(PersonEntity entity) {
        if ( entity == null ) {
            return null;
        }

        Person person = new Person();

        person.setName( entity.getName() );
        person.setAge( entity.getAge() );

        return person;
    }
}

mapstruct.defaultComponentModelオプションを使う

@Mapperコンポーネントモデルを毎回指定するのは面倒なので、注釈処理にmapstruct.defaultComponentModelオプションを指定して一律設定することができる。 今回はGradleを使った場合。

...
compileJava {
    options.compilerArgs = [
        '-Amapstruct.defaultComponentModel=spring'
    ]
}
...

@MapperConfig を使う

MapperConfigクラスを使ってコンポーネントモデルを指定することもできる。

@MapperConfig(componentModel = "spring")
public interface SpringConfig {
}

作成したMapperConfigクラスをMapperに指定する。

@Mapper(config = SpringConfig.class)
public interface SpringMapper {
    Person toPerson(PersonEntity entity);
}