weblog@kentama

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

【MapStruct】@Context を使う

@Context パラメータを使用して、独自のカスタムメソッドを使用することができる。

環境

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

Mapper

@Mapper
public interface ContextMapper {

    ContextMapper MAPPER = Mappers.getMapper(ContextMapper.class);

    PersonEntity toPersonEntity(Person person);

    PersonEntity toPersonEntity(Person person, @Context Locale locale);

    default String uppercase(String name, @Context Locale locale) {
        return name.toUpperCase(locale);
    }
}

生成されたMapper @Context パラメータがないメソッドにカスタムメソッドが適用されていないことがわかる。

/*
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2018-03-14T22:43:19+0900",
    comments = "version: 1.2.0.Final, compiler: javac, environment: Java 9.0.1 (Oracle Corporation)"
)
*/
public class ContextMapperImpl implements ContextMapper {

    @Override
    public PersonEntity toPersonEntity(Person person) {
        if ( person == null ) {
            return null;
        }

        PersonEntity personEntity = new PersonEntity();

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

        return personEntity;
    }

    @Override
    public PersonEntity toPersonEntity(Person person, Locale locale) {
        if ( person == null ) {
            return null;
        }

        PersonEntity personEntity = new PersonEntity();

        personEntity.setName( uppercase( person.getName(), locale ) );
        personEntity.setAge( person.getAge() );

        return personEntity;
    }
}

テストコード

@Test
public void test1() {
    Person person = new Person("curry", 30);
    PersonEntity entity = ContextMapper.MAPPER.toPersonEntity(person, Locale.JAPAN);

    assertThat(entity.getName()).isEqualTo("CURRY");
    assertThat(entity.getAge()).isEqualTo(30);
}

@Test
public void test2() {
    Person person = new Person("curry", 30);
    PersonEntity entity = ContextMapper.MAPPER.toPersonEntity(person);

    assertThat(entity.getName()).isEqualTo("curry");
    assertThat(entity.getAge()).isEqualTo(30);
}