ModelMapperのcustom mappingについて

エキサイト株式会社 メディアサービスエンジニアの中尾です。 前回に続いてModelMapperのちょっとした内容を説明します。 現場ではほとんど使うことはないと思うので、「こんなこともできるんだ」ぐらいでお願いします。

コードは以下になります。

@ExtendWith(MockitoExtension.class)
public class ModelMapperTest {

    @Test
    public void testModelMapper() {
        final ModelMapper modelMapper = new ModelMapper();
        modelMapper.addMappings(new PropertyMap<TestModel, Model>() {
            @Override
            protected void configure() {
                using(toUserId).map(source, destination.getUserId());
                using(toFirstname).map(source, destination.getFirstname());
                using(toLastname).map(source, destination.getLastname());
            }
        });

        final TestModel testModel = new TestModel();
        testModel.setUserId("10000");
        testModel.setUserName("naka sho");

        final Model map = modelMapper.map(testModel, Model.class);
        Assertions.assertEquals(
                10000,
                map.getUserId()
        );
        Assertions.assertEquals(
                "naka",
                map.getFirstname()
        );
        Assertions.assertEquals(
                "sho",
                map.getLastname()
        );
    }

    private Converter<TestModel, Integer> toUserId = context ->
            Integer.valueOf(context.getSource().getUserId());

    private Converter<TestModel, String> toFirstname = context ->
    {
        final String[] s = context.getSource().getUserName().split(" ");
        return s[0];
    };

    private Converter<TestModel, String> toLastname = context ->
    {
        final String[] s = context.getSource().getUserName().split(" ");
        return s[1];
    };

    @Data
    public static class Model {
        private int userId;
        private String firstname;
        private String lastname;
    }

    @Data
    public static class TestModel {
        private String userId;
        private String userName;
    }
}

解説

addMappingsを使って、PropertyMapで元のモデルと先のモデルの設定をします。

configureをOverrideして、usingを使ってConverterを各プロパティごとに設定してください。

設定していない場合はModelMapperがよしなにmappingします。

mapping処理をModelMapper内に内包することができますが、SpringBootでbean化している場合はシングルトンになっておりますので予期せぬところで障害が発生するかもしれません。

ModelMapperのbeanを大量に作ることで避けられるかもしれませんが、そもそもmappingをModelMapper頼りにしてもいいのでしょうか?

現場と相談して使ってください。