ホーム > Java > ModelMapper > ModelMapper使用例

 ModelMapper使用例

オブジェクト間でプロパティをコピーするModelMapperの使用例を以下に示す。

1. コピー元クラス

package com.ziqoo.demo.modelmapper;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
public class SrcDto {
    private String name;
    private Integer age;
    private City city;

    @Data
    @AllArgsConstructor
    public static class City {
        private String cityName;
    }
}

2. コピー先クラス

package com.ziqoo.demo.modelmapper;

import lombok.Data;

@Data
public class DestDto {
    private String name;
    private Integer age;
    private String name2;
    private Integer age2;
    private City city;

    @Data
    public static class City {
        private String cityName;
        private String address;
    }

}

3. 使用例

package com.ziqoo.demo.modelmapper;

import java.util.ArrayList;
import java.util.List;

import org.modelmapper.Condition;
import org.modelmapper.Converter;
import org.modelmapper.ModelMapper;
import org.modelmapper.Provider;
import org.modelmapper.TypeToken;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MapperTrial {
    public void doSomething() {
        // コピー元
        List<SrcDto> list = new ArrayList<>();

        SrcDto src = new SrcDto();
        src.setName("user1");
        src.setAge(20);
        src.setCity(new SrcDto.City("Tokyo"));
        list.add(src);

        src = new SrcDto();
        src.setName("user2");
        src.setAge(21);
        src.setCity(new SrcDto.City("Osaka"));
        list.add(src);

        //
        // 単純マッピング
        //
        log.info("単純マッピング");
        ModelMapper modelMapper = new ModelMapper();
        
        DestDto dest = modelMapper.map(src, DestDto.class);
        
        log.info("dest = {}", dest.toString());

        //
        //Listのマッピング
        //
        log.info("Listのマッピング");
        destList = modelMapper.map(list, new TypeToken<List<DestDto>>() {}.getType());

        destList.forEach(d -> log.info("dest = {}", d.toString()));

        //
        // マッピング指定
        //
        log.info("マッピング指定");
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMapping(SrcDto::getName, DestDto::setName2);

        dest = modelMapper.map(src, DestDto.class);

        log.info("dest = {}", dest.toString());


        //
        // マッピング指定複数
        //
        log.info("マッピング指定複数");
        modelMapper = new ModelMapper();
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMappings(mapper -> {
            mapper.map(SrcDto::getName, DestDto::setName2);
            mapper.map(SrcDto::getAge, DestDto::setAge2);
        });

        dest = modelMapper.map(src, DestDto.class);

        log.info("dest = {}", dest.toString());


        //
        // マッピングスキップ指定
        //
        log.info("マッピングスキップ指定");
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMappings(mapper -> {
            mapper.skip(DestDto::setName);
            mapper.skip(DestDto::setAge);
        });

        dest = modelMapper.map(src, DestDto.class);

        log.info("dest = {}", dest.toString());

        //
        // コンバータ指定
        //
        log.info("コンバータ");
        Converter<String, String> toUpperCase =
                ctx -> ctx.getSource() == null ? null : ctx.getSource().toUpperCase();

        modelMapper = new ModelMapper();
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMappings(mapper -> {
            mapper.using(toUpperCase).map(SrcDto::getName, DestDto::setName);
        });

        dest = modelMapper.map(src, DestDto.class);

        log.info("dest = {}", dest.toString());

        //
        // コピー先インスタンスのプロバイダー指定
        //
        log.info("プロバイダー");
        Provider<destdto.city> cityProvider = req -> {
            DestDto.City city = new DestDto.City();
            city.setAddress("1-1");
            return city;
        };

        modelMapper = new ModelMapper();
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMappings(mapper ->
           mapper.with(cityProvider).map(SrcDto::getCity, DestDto::setCity));

        dest = modelMapper.map(src, DestDto.class);

        log.info("dest = {}", dest.toString());

        //
        // 条件付きマッピング
        //
        log.info("条件付きマッピング");
        Condition<String, String> isOsaka = ctx -> "Osaka".equals(ctx.getSource());

        modelMapper = new ModelMapper();
        modelMapper.typeMap(SrcDto.class, DestDto.class).addMappings(mapper ->
           mapper.when(isOsaka).<String>skip(s -> s.getCity().getCityName(), (d, v) -> d.getCity().setCityName(v)));

        destList = modelMapper.map(list, new TypeToken<List<DestDto>>() {}.getType());

        destList.forEach(d -> log.info("dest = {}", d.toString()));
    }
}

4. 実行結果

14:42:35.076 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - 単純マッピング
14:42:35.114 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=null, age2=null, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.117 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - Listのマッピング
14:42:35.117 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user1, age=20, name2=null, age2=null, city=DestDto.City(cityName=Tokyo, address=null))
14:42:35.117 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=null, age2=null, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.117 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - マッピング指定
14:42:35.314 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=user2, age2=null, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.314 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - マッピング指定複数
14:42:35.317 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=user2, age2=21, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.317 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - マッピングスキップ指定
14:42:35.335 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=null, age=null, name2=user2, age2=21, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.335 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - コンバータ
14:42:35.335 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=USER2, age=21, name2=null, age2=null, city=DestDto.City(cityName=Osaka, address=null))
14:42:35.335 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - プロバイダー
14:42:35.360 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=null, age2=null, city=DestDto.City(cityName=Osaka, address=1-1))
14:42:35.360 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - 条件付きマッピング
14:42:35.377 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user1, age=20, name2=null, age2=null, city=DestDto.City(cityName=Tokyo, address=null))
14:42:35.377 [main] INFO com.ziqoo.demo.modelmapper.MapperTrial - dest = DestDto(name=user2, age=21, name2=null, age2=null, city=null)

ModelMapper

リンク

コーポレートサイトにちょうどいいCMS、baserCMS