weblog

技術的なメモ置き場。

【MapStruct】Decoratorを使う

Decoratorを使うことでマッピングをカスタマイズすることができる。

環境

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

Mapperの作成

@DecoratedWith にDecoratorクラスを指定する。

@Mapper
@DecoratedWith(PersonMapperDecorator.class)
public interface PersonMapper {

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

    Person toPerson(PersonEntity entity);
}

Decoratorの作成

抽象クラスで作成する。 上記で作成したMapperを実装し、任意のメソッドをカスタマイズする。

public abstract class PersonMapperDecorator implements PersonMapper {

    private final PersonMapper delegate;

    public PersonMapperDecorator(PersonMapper delegate) {
        this.delegate = delegate;
    }

    @Override
    public Person toPerson(PersonEntity entity) {
        Person dto = delegate.toPerson(entity);
        dto.setName(dto.getName().toUpperCase());
        return dto;
    }
}

テスト

@Test
public void test() {
    PersonEntity entity = new PersonEntity();
    entity.setName("curry");

    Person person = PersonMapper.MAPPER.toPerson(entity);

    assertThat(person.getName()).isEqualTo("CURRY");
}