自定义Bean转换工具类

server/2024/9/20 3:53:44/ 标签: java, bean, SpringBoot, bean转化

BeanConvertor工具类:简化Java对象转换的利器

在Java开发中,我们经常需要在不同的对象之间转换数据。这可能是因为我们需要将数据从一个层(如数据访问层)转移到另一个层(如服务层或表示层),或者是因为我们需要将外部API的数据结构转换为我们的内部数据结构。这种转换过程可能会变得繁琐且容易出错。为了解决这个问题,我们可以自定义一个强大的工具类:BeanConvertor。

BeanConvertor类的完整代码

首先,让我们看一下BeanConvertor类的完整代码:

java">import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.springframework.beans.BeanUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;/*** @desc: Bean转换工具类* @author: shy* @date: 2024/07/19 0:08*/
public class BeanConvertor {private static final ObjectMapper CONVERTOR_MAPPER = new ObjectMapper();/*** 将p1对象转换为 P2 类型的对象。* 基于反射,主要用于相同结构的对象间属性拷贝** @param fromObj     源对象* @param targetClazz 目标对象的类* @return p2 对象* @author shy* @date: 2024/07/19 0:08*/public static <P1, P2> P2 convertTo(P1 fromObj, Class<P2> targetClazz) {if (fromObj == null) {return null;}P2 targetObj;try {targetObj = targetClazz.newInstance();} catch (Exception e) {throw new IllegalArgumentException("Can not new object of class " + targetClazz.getName(), e);}BeanUtils.copyProperties(fromObj, targetObj);return targetObj;}/*** 将 源列表 中的对象拷贝到新目标类列表中。* 基于反射,主要用于相同结构的对象间属性拷贝** @param fromList    源列表* @param targetClazz 目标对象的泛型* @return 以目标类为元素类型的列表。* @author shy* @date: 2024/07/19 0:08*/public static <C1, C2> List<C2> convertListTo(List<C1> fromList, Class<C2> targetClazz) {if (fromList == null || fromList.isEmpty()) {return Collections.emptyList();}List<C2> targetList = new LinkedList<>();for (C1 fromObj : fromList) {targetList.add(convertTo(fromObj, targetClazz));}return targetList;}/*** 将p1对象转换为 P2 类型的对象。* 基于 JSON 序列化和反序列化,可以处理更复杂的类型转换* 例如: p1对象和p2对象中分别包含a对象和b对象, a对象和b对象中的字段是一致的, 并且在p1对象和p2对象中的属性名也是一致的, 这种情况下就需要使用json进行对象类型转化** @param fromObj     源对象* @param targetClazz 目标对象的类* @return P2* @author shy* @date: 2024/07/19 0:08*/public static <P1, P2> P2 convertByJackson(P1 fromObj, Class<P2> targetClazz) {return CONVERTOR_MAPPER.convertValue(fromObj, targetClazz);}/*** 将 源列表 中的对象拷贝到新目标类列表中。* 返回值的泛型根据接受参数决定* 基于 JSON 序列化和反序列化,可以处理更复杂的类型转换* 例如: p1对象和p2对象中分别包含a对象和b对象, a对象和b对象中的字段是一致的, 并且在p1对象和p2对象中的属性名也是一致的, 这种情况下就需要使用json进行对象类型转化** @param fromList    源列表* @param targetClazz 目标对象的泛型* @return List<C2>* @author shy* @date: 2024/07/19 0:08*/public static <C1, C2> List<C2> convertListByJackson(List<C1> fromList, Class<C2> targetClazz) {CollectionType collectionType = CONVERTOR_MAPPER.getTypeFactory().constructCollectionType(List.class, targetClazz);return CONVERTOR_MAPPER.convertValue(fromList, collectionType);}
}

现在,让我们详细介绍这个类中的每个方法,并提供相应的使用示例。

1. convertTo 方法

convertTo方法用于将一个对象转换为另一个类型的对象。它使用Spring框架的BeanUtils.copyProperties方法来复制属性。

示例:

java">public class Person {private String name;private int age;// getters and setters
}public class PersonDTO {private String name;private int age;// getters and setters
}// 使用示例
Person person = new Person();
person.setName("John");
person.setAge(30);PersonDTO personDTO = BeanConvertor.convertTo(person, PersonDTO.class);
System.out.println(personDTO.getName()); // 输出: John
System.out.println(personDTO.getAge());  // 输出: 30

2. convertListTo 方法

convertListTo方法用于将一个对象列表转换为另一个类型的对象列表。它内部使用convertTo方法来转换每个对象。

示例:

java">List<Person> personList = new ArrayList<>();
personList.add(new Person("John", 30));
personList.add(new Person("Alice", 25));List<PersonDTO> personDTOList = BeanConvertor.convertListTo(personList, PersonDTO.class);
for (PersonDTO dto : personDTOList) {System.out.println(dto.getName() + ": " + dto.getAge());
}
// 输出:
// John: 30
// Alice: 25

3. convertByJackson 方法

convertByJackson方法使用Jackson库来进行对象转换。这种方法特别适用于处理嵌套对象的情况。

示例:

java">public class Address {private String street;private String city;// getters and setters
}public class AddressDto {private String street;private String city;// getters and setters
}public class Employee {private String name;private Address address;// getters and setters
}public class EmployeeDTO {private String name;private AddressDto address;// getters and setters
}// 使用示例
Employee employee = new Employee();
employee.setName("John");
Address address = new Address();
address.setStreet("123 Main St");
address.setCity("New York");
employee.setAddress(address);EmployeeDTO employeeDTO = BeanConvertor.convertByJackson(employee, EmployeeDTO.class);
System.out.println(employeeDTO.getName()); // 输出: John
System.out.println(employeeDTO.getAddress().getStreet()); // 输出: 123 Main St
System.out.println(employeeDTO.getAddress().getCity()); // 输出: New York

4. convertListByJackson 方法

convertListByJackson方法使用Jackson库来转换对象列表。这种方法同样适用于处理包含嵌套对象的列表。

示例:

java">List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("John", new Address("123 Main St", "New York")));
employeeList.add(new Employee("Alice", new Address("456 Elm St", "Los Angeles")));List<EmployeeDTO> employeeDTOList = BeanConvertor.convertListByJackson(employeeList, EmployeeDTO.class);
for (EmployeeDTO dto : employeeDTOList) {System.out.println(dto.getName() + ": " + dto.getAddress().getStreet() + ", " + dto.getAddress().getCity());
}
// 输出:
// John: 123 Main St, New York
// Alice: 456 Elm St, Los Angeles

5. 内容关联

大家也可以结合这篇文章, 使用FastJson完成对类中字段类型不一致的属性进行拷贝

Java中对象的拷贝之字段类型不一致

在这里插入图片描述

总结

BeanConvertor工具类提供了一种简单而强大的方式来处理Java对象之间的转换。它不仅可以处理简单的对象转换,还可以通过Jackson库处理更复杂的嵌套对象转换。这个工具类可以大大简化我们的代码,提高开发效率,并减少因手动转换可能引入的错误。

在实际开发中,你可能需要根据项目的具体需求来调整或扩展这个工具类。例如,你可能需要添加更多的错误处理,或者支持更多的转换场景。无论如何,这个BeanConvertor类为对象转换提供了一个很好的起点。


http://www.ppmy.cn/server/65320.html

相关文章

STM32CubeIDE(STM32L432KC片上ADC)

目录 一、概念 二、使用 1、定时器触发模式 1.1 软件配置 1.2 代码编写 2、定时器触发ADC 多通道DMA 2.1 软件配置 2.2 代码编写 一、概念 1. 类型与精度&#xff1a;STM32L432KC的ADC是一个12位逐次逼近型模拟数字转换器&#xff0c;能够提供高精度的模拟信号测量。其…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

前端八股文 $set

为什么会有$set vue2中对数组中新增的属性是监听不到的 如图 vue 插件中有但是 视图中没有刷新 解决方法 解决就是 $set() 就是在数组中新增属性的时候可以重新渲染视图 具体的写法 写法 就是 第一个 是在那个对象上新增 第二个参数 是新增的属性 第三个参数是 新增的属性…

vscode 文件颜色变绿色

解决&#xff1a;关闭git功能 在设置中搜索Git:Enabled&#xff0c;取消Decorations: Enabled的勾选

【BUG】已解决:xlrd.biffh.XLRDError: Excel xlsx file; not supported

已解决&#xff1a;xlrd.biffh.XLRDError: Excel xlsx file&#xff1b; not supported 目录 已解决&#xff1a;xlrd.biffh.XLRDError: Excel xlsx file&#xff1b; not supported 【常见模块错误】 错误原因 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/…

Flex和Bison

Flex和Bison是Linux和Unix环境下两个非常强大的工具&#xff0c;分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。下面我将详细介绍Flex和Bison的基本概念、功能、用法以及它们之间的关系。 一、Flex 1. 基本概念 Flex&#xff08;其…

数字通云平台 智慧政务OA PayslipUser SQL注入漏洞复现

0x01 产品简介 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术,为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平,推动电子政务向更高层次发展。 0x02 漏洞概述 数字通云平台 智慧政务OA Paysli…

怎样在 PostgreSQL 中进行用户权限的精细管理?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中进行用户权限的精细管理&#xff1f;一、权限管理的重要性二、PostgreSQL 中的权…

02-用户画像-技术架构+业务划分

技术架构 python开发 es flume 流数据读取写入kafka文件 kafka 消息队列 sqoop 将数据导入数仓hive StructureStream 动态画像的处理 SparkSQL 静态画像的处理 &#xff0c;批数据处理 读取kafka获取用户行为数据 fineBI 数据展示 业务划分 离线业务 静态画像 …

[计算机网络] VPN技术

1. 概述 虚拟专用网络&#xff08;VPN&#xff09;技术利用互联网服务提供商&#xff08;ISP&#xff09;和网络服务提供商&#xff08;NSP&#xff09;的网络基础设备&#xff0c;在公用网络中建立专用的数据通信通道。VPN的主要优点包括节约成本和提供安全保障。 优点&#…

Android 性能优化之线程优化

文章目录 Android 性能优化之线程优化线程调度原理Android线程调度注意点 异步方式线程使用准则线程池配置 Android 性能优化之线程优化 线程调度原理 分时调度模型&#xff1a;让线程轮流获取CPU的使用权&#xff0c;并且平均每个线程占用CPU的时间片。这种方式确保了每个线…

电脑没有声音了怎么恢复?3个硬核操作,解救静音危机!

当你沉迷于电脑中的音乐、电影或是游戏时&#xff0c;突然一阵寂静袭来&#xff0c;是不是感觉就像突然按下了暂停键&#xff1f;这无疑是一场大灾难&#xff01;电脑没有声音了怎么恢复呢&#xff1f;急&#xff0c;今天小编带来了3个硬核操作&#xff0c;让你从无声的幽谷中爬…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段&#xff1f;微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1&#xff1a;三层报文本地转发场景场景2&#xff1a;三层报文跨设备转发场景 微分段的…

解决GoLand添加GOROOT提示The selected directory is not a valid home for Go Sdk的问题

现象 解决 在Go安装路径下找到zversion.go文件&#xff0c;我的在D:\Program Files\Go1.21.1\src\runtime\internal\sys下面 打开文件&#xff0c;添加如下内容&#xff1a; const TheVersion go1.21.1保存后再重新添加GOROOT即可

【数据分享】2013-2022年我国省市县三级的逐日SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000——2022年的省市县三级的逐日PM2.5数据和2013-2022年的省市县三级的逐日CO数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国2013——2022年的省…

高精度滚珠导轨:驱动装配线自动化升级!

滚珠导轨是一种先进的运动控制装置&#xff0c;具有高精度、高稳定性和高可靠性等特点&#xff0c;被广泛应用于各个行业&#xff0c;为工业生产带来了巨大的影响。 滚珠导轨技术的广泛应用&#xff0c;尤其是在实现装配流程自动化中&#xff0c;不仅提高了生产效率&#xff0c…

宝塔Wordpress 插件 Redis object cache 导致内存很高 80%以上的原因和解决

查看内存前X 使用以下命令查看前10&#xff0c;修改10数字即可查看前X ps aux | head -1;ps aux |grep -v PID |sort -rn -k 4 | head -10 查看cpu占用 查看前10 ps aux | head -1;ps aux |grep -v PID |sort -rn -k 3 | head -10 原因是 4GiB 内存的服务器&#xff0c;Redis会…

[技术总结] C++ 使用经验

const 和 constexpr 有什么区别. const 一般是设置一个只读的属性, 在运行时还有可能通过cast变成一个可修改的. 但是constexpr是告诉编译器这就是一个常亮, 在编译时就可以计算出来然后进行替换.static 修饰的成员函数 & 成员变量 static 修饰的成员函数只能访问 static 修…

鸿蒙Navigation路由能力汇总

基本使用步骤&#xff1a; 1、新增配置文件router_map&#xff1a; 2、在moudle.json5中添加刚才新增的router_map配置&#xff1a; 3、使用方法&#xff1a; 属性汇总&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-compone…

40、PHP 实现对称的二叉树(含源码)

题目&#xff1a; PHP 实现对称的二叉树 描述&#xff1a; 请实现一个函数&#xff0c;用来判断一颗二叉树是不是对称的。 注意&#xff0c;如果一个二叉树同此二叉树的镜像是同样的&#xff0c;定义其为对称的。 <?php/*class TreeNode{var $val;var $left NULL;var $r…