最近在项目开发中,各个模块中经常因为业务场景交互,会大量使用到搜索和查询的一些业务方法。
但是又不能影响其它模块已定义好的实体Bean对象,所以根据业务场景搜索结果定义不同的实体Bean对象,这样在代码中就会有很多不同的实体Bean转换的冗余代码。
1.ModelMapper 几个基础API方法
ModelMapper这个工具的入口类就是ModelMapper,因此转换就需要从这个类入口.简单看下API
(1)addConverter() :顾名思义,添加转换器
(2)addMappings() :添加映射器
(3)createTypeMap() :创建A-B的转换器关系
(4)getConfiguration() :获取配置
(5)map() ;映射处理
2.简单Model转换
public void testUserInfo(){
User user = new User();
user.setId(10000)
user.setName("Tom")
user.setAge(20);
user.setSex("男");
ModelMapper modelMapper = new ModelMapper();
// 转换
UserInfo obj = modelMapper.map(user, UserInfo.class);
}
该方法的优势就是可以自定义转换关系,实现不同的属性,不同类型的属性的复制,应用很广泛,但是也有一些缺点,就是没有的属性会为空值.
3.自定义转换
自定义有很多转换,比如Provider,Converter,Condition,PropertyMap等,以下是个综合的几个个例
@Test
public void testUserToUserInfo(){
User user = new User();
user.setId(10000)
user.setName("Tom")
user.setAge(20);
user.setSex("男");
ModelMapper modelMapper = new ModelMapper();
//转换内容提供者
Provider
public String get() {
return "自定义提供者";
}
};
//创建自定义转换规则
Converter
protected String convert(String source) {
System.out.println(source);
return source == null ? null : source.toUpperCase();
}
};
//创建自定义条件转换
Condition
System.out.println(context.getSource());
return context.getSource() > 2;
};
//创建自定义映射规则
PropertyMap
@Override
protected void configure() {
using(toUppercase).map(source.getName(),destination.getHonor());//使用自定义转换规则
with(personProvider).map(source.getHonor(),destination.getName());//使用自定义属性提供覆盖
map(source.getAvatar()).setAvatar(null);//主动替换属性
skip(destination.getAge());
when(gt2).map().setId(10000);//过滤属性
}
};
//添加映射器
modelMapper.addMappings(propertyMap);
modelMapper.validate();
//转换
UserInfo userInfo = modelMapper.map(user,UserInfo.class);
System.out.println(userInfo);
}
分析下:
Provider,Converter,Condition三个都算是转换前奏,所有的转换规则都是在PropertyMap里面配置.所以分析这个里面的配置即可.
1.using(toUppercase).map(source.getName(),destination.getHonor());//使用自定义转换规则
首先toUppercase是一个Converter,也就是sources的name会经过这个转换器,然后才设置到destination的honor中.
2.with(personProvider).map(source.getHonor(),destination.getName());//使用自定义属性提供覆盖
personProvider类似一个Bean工厂,当使用这个的时候,对于sources调用getHonor()的时候实际上是调用personProvider的get方法.所以结果name='自定义提供者'
3.map(source.getAvatar()).setAvatar(null);//主动替换属性
可以主动重设某些属性
4.skip(destination.getAge());
过滤指定属性
5.when(gt2).map().setId(10000);//条件过滤属性
条件过滤属性,当满足gt2的时候才会调用setId方法.
4.对于集合的映射
对于集合的映射,因为泛型擦除的存在,所以需要告诉ModelMapper要转换的类型,所以就有了TypeToken这个类.
@Test
public void testListToListDto() {
User user1 = new User();
user.setId(10000)
user.setName("Tom")
user.setAge(20);
user.setSex("男");
User user2 = new User();
user.setId(10000)
user.setName("Jual")
user.setAge(20);
user.setSex("女");
List
users.add(user1);
users.add(user2);
ModelMapper modelMapper = new ModelMapper();
List>() {}.getType());
System.out.println(userInfo);
}
5.Manven地址: