ModelMapperを利用して@Value+@Builderアノテーション付きのクラスへ変換する

ModelMapperの説明は以下。

modelmapper.org

要は以下から

@Data
public class AuthorData {
    private long id;
    private String name;
}

以下のようにsetterのないクラスへの変換である。

@Value
@Builder
public class Author {
    long id;
    String name;
}

ModelMapperを利用する場合通常は変換先にsetterがないと変換が出来ないが、以下を参考にすることで変換が出来た。

stackoverflow.com

具体的には以下のModelMapperを用いて

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
        .setMatchingStrategy(MatchingStrategies.STRICT)
        .setDestinationNamingConvention((propertyName, propertyType) ->
                PropertyType.METHOD.equals(propertyType))
        .setDestinationNameTransformer((name, nameableType) -> Strings.decapitalize(name));

以下のように変換を行うことで実現できる。

AuthorData authorData = new AuthorData();
authorData.setId(1);
authorData.setName("name");
Author author = modelMapper.map(authorData, Author.AuthorBuilder.class).build();

AuthorDataからAuthorに直接変換するのではなく、Author.AuthorBuilderに変換してビルドするイメージ。ModelMapperの設定部分はひょっとしたら省ける部分もあるかもしれないが、ないかもしれない(未確認)。

setterは基本的には作成したくないケースもあると思うので、そういった場合には有用な手段になると思う。