BeanCopier系列之一:特性测试 
BeanCopier系列之三:缓存BeanCopier提升性能

当源和目标类的属性类型不同时,不能拷贝该属性,此时我们可以通过实现Converter接口来自定义转换器:

源类和目标类:

Java代码  
  1. public class AccountEntity {
  2. private int id;
  3. private Timestamp createTime;
  4. private BigDecimal balance;
  5. // Getters and setters are omitted
  6. }
Java代码  
  1. public class AccountDto {
  2. private int id;
  3. private String name;
  4. private String createTime;
  5. private String balance;
  6. // Getters and setters are omitted
  7. }

1. 不使用Converter

Java代码  
  1. public class BeanCopierConverterTest {
  2. @Test
  3. public void noConverterTest() {
  4. AccountEntity po = new AccountEntity();
  5. po.setId(1);
  6. po.setCreateTime(new Timestamp(10043143243L));
  7. po.setBalance(BigDecimal.valueOf(4000L));
  8. BeanCopier copier = BeanCopier.create(AccountEntity.class, AccountDto.class, false);
  9. AccountDto dto = new AccountDto();
  10. copier.copy(po, dto, null);
  11. Assert.assertNull(dto.getCreateTime()); // 类型不同,未拷贝
  12. Assert.assertNull(dto.getBalance()); // 类型不同,未拷贝
  13. }
  14. }

2. 使用Converter

基于目标对象的属性出发,如果源对象有相同名称的属性,则调一次convert方法:

Java代码  
  1. package net.sf.cglib.core;
  2. public interface Converter {
  3. // value 源对象属性,target 目标对象属性类,context 目标对象setter方法名
  4. Object convert(Object value, Class target, Object context);
  5. }
Java代码  
  1. @Test
  2. public void converterTest() {
  3. AccountEntity po = new AccountEntity();
  4. po.setId(1);
  5. po.setCreateTime(Timestamp.valueOf("2014-04-12 16:16:15"));
  6. po.setBalance(BigDecimal.valueOf(4000L));
  7. BeanCopier copier = BeanCopier.create(AccountEntity.class, AccountDto.class, true);
  8. AccountConverter converter = new AccountConverter();
  9. AccountDto dto = new AccountDto();
  10. copier.copy(po, dto, converter);
  11. Assert.assertEquals("2014-04-12 16:16:15", dto.getCreateTime());
  12. Assert.assertEquals("4000", dto.getBalance());
  13. }
  14. static class AccountConverter implements Converter {
  15. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. @SuppressWarnings("rawtypes")
  17. @Override
  18. public Object convert(Object value, Class target, Object context) {
  19. if (value instanceof Integer) {
  20. return (Integer) value;
  21. } else if (value instanceof Timestamp) {
  22. Timestamp date = (Timestamp) value;
  23. return sdf.format(date);
  24. } else if (value instanceof BigDecimal) {
  25. BigDecimal bd = (BigDecimal) value;
  26. return bd.toPlainString();
  27. }
  28. return null;
  29. }
  30. }

注:一旦使用Converter,BeanCopier只使用Converter定义的规则去拷贝属性,所以在convert方法中要考虑所有的属性。

BeanCopier系列之二:使用Converter相关推荐

  1. 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator

    文章作者:张健(Zhang Jonathan) 上一篇文章 从产品展示页面谈谈Hybris的特有概念和设计结构 我们讲解了Hybris一些特有的概念以及大体架构,并且介绍了Facade层里是如何定义D ...

  2. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  3. 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析

    摘要: 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 (二):Kubernetes如何助力Spark大数据分析 概述 本文为大家介绍一种容器化的数据服务Spark ...

  4. Skype for business混合部署系列之二自定义拓扑信息

    Skype for business混合部署系列之二自定义拓扑信息 此次部署前端服务器共3台,后端数据库2台采用always on方式,2台SQL Server服务器已经安装完成,在这里不做文档,本章 ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  6. 深入理解 Linux Cgroup 系列(二):玩转 CPU

    原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...

  7. 【冰极峰教程系列之二】:牢不可破的九宫格布局

    原创:冰极峰 转载请注明出处 时间:2009年6月22日 8:40:16 冰极峰教程系列之一:九宫格基本布局 冰极峰教程系列之二:牢不可破的九宫格布局 冰极峰教程系列之三:三层分离的完美九宫格 冰极峰 ...

  8. WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现...

    原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...

  9. MySQL优化系列(二)--查找优化(1)(非索引设计)

    MySQL优化系列(二)--查找优化(1)(非索引设计) 接下来这篇是查询优化,用户80%的操作基本都在查询,我们有什么理由不去优化他呢??所以这篇博客将会讲解大量的查询优化(索引以及库表结构优化等高 ...

最新文章

  1. flask 检测post是否为空_用Flask和Vue制作一个单页应用(五)
  2. Activity动画效果笔记
  3. git概念篇(remote,base,local)的含义
  4. 5.字符串:各种奇葩的内置方法/格式化
  5. Shell脚本语言与编译型语言的差异
  6. ZOJ 4028 15th浙江省省赛E. LIS(神奇贪心)
  7. Have Fun with Numbers及循环链表(约瑟夫问题)
  8. javascript的caller,callee,call,apply
  9. matlab EOF程序
  10. java手机连点脚本_自动连点器app下载 自动连点器(屏幕点击器) for Android v1.0 安卓版 下载-脚本之家...
  11. 软件项目的需求变更及对策
  12. CAD软件中怎么创建异形视口?
  13. instagram获取图片地址和视频地址
  14. 在linux下恶臭hellotext中作用的?,《Linux内核与程序设计》实验学习笔记
  15. Verilog语言基础语法
  16. 判断当前页面是否在微信内置浏览器中打开
  17. 保姆级教程:群晖nas内网穿透之ipv6/ipv4 ddns+frp双管齐下!
  18. 字符串水题——相对分子质量
  19. ppt演示文档如何瘦身
  20. 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的教室图书馆座位预约小程序系统设计与实现

热门文章

  1. java 删除本地文件夹或文件
  2. java几个注解的作用及比较(@RestController、@Controller、@ResponseBody、@RequestBody等)
  3. Win10安装nodejs 错误代码2502,2503
  4. 微信小程序——剪贴板 的使用
  5. 大数据剖析热点新闻:996、巴黎圣母院、奔驰维权为什么成为本周热搜
  6. UE4|Sequence Recorder 序列记录使用方法
  7. 外罚函数法(一):外罚函数的构造
  8. python-yaml文件使用(PyYAML)
  9. 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
  10. FL Studio20.9安装汉化版水果下载教程