Mapstructマッピングを抽出する方法はありますか?

Aug 27 2020

オブジェクトを別のオブジェクトにマップする基本的なケースがあるとしましょう。Mapperクラスでマッピングを宣言する必要があります。

検証のために、元のフィールド名とそれに対応するマッピングを覚えておきたい場合があります。

「手動で」マッピングを行うことなく、mapstructでそれを行う方法はありますか?

これが私が期待するものの例です。

public class PersonDemo {

    public static void main(String[] args) {
        final PersonMapper mapper = Mappers.getMapper(PersonMapper.class);
        Person person = mapper
            .toPerson(new PersonDto()
                .setFirstName("John")
                .setName("Doe"));

        System.out.println(person);

        System.out.println("Expected " + toPersonDesc("firstName") + " to be firstName");
        System.out.println("Expected " + toPersonDesc("name") + " to be lastName");
    }

    @Mapper
    public interface PersonMapper {
        @Mapping(target = "lastName", source = "name")
        Person toPerson(PersonDto dto);

    }

    //expected method. to be generated somehow from the mapping.
    static String toPersonDesc(String fieldName) {
        switch (fieldName) {
            case "name": return "lastName";
            case "firstName": return "firstName";
        }
        return null;
    }

    @Data
    @Accessors(chain = true)
    public static class Person {

        private String lastName;
        private String firstName;
    }

    @Data
    @Accessors(chain = true)
    public static class PersonDto {

        private String name;
        private String firstName;
    }
}

回答

1 jannis Aug 28 2020 at 03:38

Mapstructでは不可能です。あなたと同様の別の質問があります:実行時にMapStructマッピングアノテーションマッピングメタデータを提供する方法。そこでの答えは、問題への「いくつかの」アプローチを説明していますが、それは非常に限られています-それは単に@Mapping注釈から情報を削り取ります(暗黙のマッピングのサポートはありません)。

ただし、これがあると非常に便利です。この機能をMapstructチームに提案する必要があります。