在实际项目中,我们常常需要把两个相似的对象相互转换,其目的是在对外提供数据时需要将一部分敏感数据(例如:密码、加密token等)隐藏起来。最普通的方法是,新建一个对象,将需要的值逐个set进去。如果有多组需要这样转换的对象,那么就需要做很多只是get/set这样无意义的工作。
在这样的背景下,ModelMapper诞生了,它是一个简单、高效、智能的对象映射工具。它的使用非常简单,首先添加maven依赖
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.1.1</version>
</dependency>
(vo dto do po)相互转换的工具类
public class CopyClassUtil {
/**
* 单个实体之间的转换
*
* @param obj
* @param result
* @param <T>
* @return
*/
public static <T> T copyClass(Object obj, Class<T> result) {
ModelMapper modelMapper = getModelMapper();
T dto = modelMapper.map(obj, result);
return dto;
}
/**
* 实体列表之间的转换
*
* @param obj
* @param result
* @param <T>
* @param <S>
* @return
*/
public static <T, S> List<T> copyClassList(List<S> obj, Class<T> result) {
List<T> list = new ArrayList<>();
ModelMapper modelMapper = getModelMapper();
for (S s : obj) {
T dto = modelMapper.map(s, result);
list.add(dto);
}
return list;
}
/**
* 实体列表Page之间的转换
*
* @param obj
* @param result
* @param <T>
* @param <S>
* @return
*/
public static <T, S> Page<T> copyClassPage(Page<S> obj, Class<T> result) {
Page<T> page = new Page<>();
ModelMapper modelMapper = getModelMapper();
for (S s : obj) {
T dto = modelMapper.map(s, result);
page.add(dto);
}
page.setTotal(obj.getTotal());
return page;
}
/**
* 实体列表转换
*
* @param sources
* @param type = new TypeToken<List<T>>(){}.getType()
* @param <S>
* @param <T>
* @return
*/
public static <S, T> List<T> copyList(List<S> sources, Type type) {
ModelMapper modelMapper = getModelMapper();
List<T> list = modelMapper.map(sources, type);
return list;
}
/**
* 实体转换
*
* @param source
* @param target
* @param <S>
* @param <T>
*/
public static <S, T> void copyClass(S source, T target) {
ModelMapper modelMapper = getModelMapper();
modelMapper.map(source, target);
}
/**
* 获取ModelMapper配置
*
* @return
*/
private static ModelMapper getModelMapper() {
ModelMapper modelMapper = new ModelMapper();
//设置候选属性
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
// 设置匹配策略为严格(默认为标准)
modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
//开启字段匹配
modelMapper.getConfiguration().setFieldMatchingEnabled(true);
//忽略歧义(如果出现歧义跳过)
modelMapper.getConfiguration().setAmbiguityIgnored(true);
return modelMapper;
}
}