- 结果:拷贝成功
18:24:24.080 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝前:userDO:UserDO(id=1, userName=Van, gmtBroth=2019-11-02T18:24:24.077, balance=100)18:24:24.200 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝后:userDTO:UserDTO(id=1, userName=Van)
3.1.2 属性名称相同、类型不同- 目标对象属性类
@Datapublic class UserEntity {private Integer id;private String userName;}
- 测试方法
/** * 属性名称相同、类型不同 */private static void sameNameDifferentType() {// 模拟查询出数据UserDO userDO = DataUtil.createData();log.info("拷贝前:userDO:{}", userDO);BeanCopier b = BeanCopier.create(UserDO.class, UserEntity.class, false);UserEntity userEntity = new UserEntity();b.copy(userDO, userEntity, null);log.info("拷贝后:userEntity:{}", userEntity);}
- 结果
19:43:31.645 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝前:userDO:UserDO(id=1, userName=Van, gmtBroth=2019-11-02T19:43:31.642, balance=100)19:43:31.748 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝后:userEntity:UserEntity(id=null, userName=Van)
- 分析
3.1.3 小节BeanCopier只拷贝名称和类型都相同的属性 。
即使源类型是原始类型(int, short和char等) , 目标类型是其包装类型(Integer, Short和Character等) , 或反之:都不会被拷贝 。3.2 自定义转换器通过3.1.2可知 , 当源和目标类的属性类型不同时 , 不能拷贝该属性 , 此时我们可以通过实现Converter接口来自定义转换器
3.2.1 准备
- 目标对象属性类
@Datapublic class UserDomain {private Integer id;private String userName;/*** 以下两个字段用户模拟自定义转换*/private String gmtBroth;private String balance;}
3.2.2 不使用Converter- 测试方法
/** * 类型不同,不使用Converter */public static void noConverterTest() {// 模拟查询出数据UserDO userDO = DataUtil.createData();log.info("拷贝前:userDO:{}", userDO);BeanCopier copier = BeanCopier.create(UserDO.class, UserDomain.class, false);UserDomain userDomain = new UserDomain();copier.copy(userDO, userDomain, null);log.info("拷贝后:userDomain:{}", userDomain);}
- 结果
19:49:19.294 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝前:userDO:UserDO(id=1, userName=Van, gmtBroth=2019-11-02T19:49:19.290, balance=100)19:49:19.394 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝后:userDomain:UserDomain(id=null, userName=Van, gmtBroth=null, balance=null)
- 分析
3.2.3 使用Converter
- 实现Converter接口来自定义属性转换
publicclass UserConverter implements Converter {/*** 时间转换的格式*/DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");/*** 自定义属性转换* @param value 源对象属性类* @param target 目标对象里属性对应set方法名,eg.setId* @param context 目标对象属性类* @return*/@Overridepublic Object convert(Object value, Class target, Object context) {if (value instanceof Integer) {return value;} else if (value instanceof LocalDateTime) {LocalDateTime date = (LocalDateTime) value;return dtf.format(date);} else if (value instanceof BigDecimal) {BigDecimal bd = (BigDecimal) value;return bd.toPlainString();}// 更多类型转换请自定义return value;}}
- 测试方法
/** * 类型不同,使用Converter */public static void converterTest() {// 模拟查询出数据UserDO userDO = DataUtil.createData();log.info("拷贝前:userDO:{}", userDO);BeanCopier copier = BeanCopier.create(UserDO.class, UserDomain.class, true);UserConverter converter = new UserConverter();UserDomain userDomain = new UserDomain();copier.copy(userDO, userDomain, converter);log.info("拷贝后:userDomain:{}", userDomain);}
- 结果:全部拷贝
19:51:11.989 [main] INFO cn.van.parameter.bean.copy.demo.BeanCopierDemo - 拷贝前:userDO:UserDO(id=1, userName=Van, gmtBroth=2019-11-02T19:51:11.985, balance=100)
3.2.4 小节- 一旦使用Converter , BeanCopier只使用Converter定义的规则去拷贝属性 , 所以在convert()方法中要考虑所有的属性 。
- 但 , 使用Converter会使对象拷贝速度变慢 。