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)

