weblog

技術的なメモ置き場。

【MapStruct】 @Qualifierを使う

@Qualifier を使うことでアノテーションで独自の変換処理を追加することができる。

環境

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

変換するクラスを用意する

public class Characters {

    public String upperCase(String string) {
        return (string == null) ? null : string.toUpperCase();
    }
}

アノテーションの作成

@Qualifier を合成したアノテーションを作成する。

@Qualifier
@Retention(CLASS)
@Target(TYPE)
public @interface CharacterConverter {
}
@Qualifier
@Retention(CLASS)
@Target(METHOD)
public @interface ToUpper {
}

アノテーションの付与

@CharacterConverter
public class Characters {

    @ToUpper
    public String upperCase(String string) {
        return (string == null) ? null : string.toUpperCase();
    }
}

Mapperの作成

nameを大文字にする。

@Mapper(uses = Characters.class)
public interface QualifierMapper {
    QualifierMapper MAPPER = Mappers.getMapper(QualifierMapper.class);

    @Mapping(target = "name", qualifiedBy = { CharacterConverter.class, ToUpper.class })
    Student toStudent(StudentEntity entity);
}

テストコード

@Test
public void test() {
    StudentEntity entity = new StudentEntity("curry", 30, "gsw");

    Student student = QualifierMapper.MAPPER.toStudent(entity);

    assertThat(student.getName()).isEqualTo("CURRY");
    assertThat(student.getAddress()).isEqualTo("gsw");
    assertThat(student.getAge()).isEqualTo(30);
}