自定义Bean转换工具类

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

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

BeanConvertor类的完整代码

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

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方法来复制属性。

示例:

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方法来转换每个对象。

示例:

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库来进行对象转换。这种方法特别适用于处理嵌套对象的情况。

示例:

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库来转换对象列表。这种方法同样适用于处理包含嵌套对象的列表。

示例:

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.mzph.cn/pingmian/48617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

2024最新版虚拟便携空调小程序源码 支持流量主切换空调型号

产品截图 部分源代码展示 urls.js Object.defineProperty(exports, "__esModule", {value: !0 }), exports.default ["9c5f1fa582bee88300ffb7e28dce8b68_3188_128_128.png", "E-116154b04e91de689fb1c4ae99266dff_960.svg", "573eee719…

mysql的索引、事务和存储引擎

目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …

构建高效Node.js中间层:探索请求合并转发的艺术

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【CSS盒模型&#xff1a;掌握网页布局的核心】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言&#x…

接口测试JMeter-1.接口测试初识

第一章 接口测试初识 1. 接口测试理论基础 “接口测试”一个让人觉得非常高大上的名词&#xff0c;特别是对于刚入门的测试同学而言。随着测试技术不断的深化&#xff0c;“接口测试”出现在我们视野中的频次越来越高。那么接口测试到底是如何做的&#xff1f;接口测试的优势又…

Flowable-SpringBoot项目集成

在前面的介绍中&#xff0c;虽然实现了绘制流程图&#xff0c;然后将流程图存储到数据库中&#xff0c;然后从数据库中获取流程信息&#xff0c;并部署和启动流程&#xff0c;但是部署的流程绘制器是在tomcat中部署的&#xff0c;可能在部分的项目中&#xff0c;需要我们将流程…

<数据集>pcb板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;693张 标注数量(xml文件个数)&#xff1a;693 标注数量(txt文件个数)&#xff1a;693 标注类别数&#xff1a;6 标注类别名称&#xff1a;[missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur…

git 提交的进阶操作

cherry-pick cherry-pick 是 Git 中的一种操作,允许你从一个分支中选择特定的 commit,并将其应用到另一个分支。它的主要用途是将特定的更改引入到其他分支,而无需合并整个分支历史。这在修复 bug 或者移植某些功能时特别有用。 cherry-pick 的使用场景 Bug 修复: 例如,你…

Python面试宝典第16题:跳跃游戏

题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的第一个下标 &#xff0c;数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true。否则&#xff0c;返回 false。 示例 1&#xff1a; 输…

detection_segmentation

目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION) 文章目录 目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION)一. 计算机视觉(AI VISION)1. 图像分类2. 目标检测与定位3. 语义分割和实例分割目标检测算法可以分为两大类&#xff1a; R-CNN生成…

Linux系统:揭开它神秘面纱的科普之旅

在这个数字化时代&#xff0c;电脑和手机成了我们生活中不可或缺的一部分。而提到这些设备的操作系统&#xff0c;大家可能首先想到的是Windows、macOS或是Android。 但你知道吗&#xff0c;在技术的海洋里&#xff0c;还有一个强大而灵活的操作系统家族&#xff0c;它就是Lin…

python-多任务编程

2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq&#xff0c;听音乐&#xff0c;同时上网浏览网页。这是我们看得到的任务&#xff0c;在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统&#xff0c;具备…

JVM--HostSpot算法细节实现

1.根节点枚举 定义&#xff1a; 我们以可达性分析算法中从GC Roots 集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots 的节点主要在全局性的引用&#xff08;例如常量或类静态属性&#xff09;与执行上下文&#xff08;例如 栈帧中的本地变量表&a…

时间序列预测方法概述

这里写目录标题 时间序列预测方法概述1.统计方法1.1 ARIMA (AutoRegressive Integrated Moving Average)1.2 State Space Models1.3 Exponential Smoothing 2.机器学习方法2.1 SVM (Support Vector Machines)2.2 RF (Random Forest)2.3 KNN (K-Nearest Neighbors) 3. 深度学习方…

latex \left{ \right} 环境不能自动换行

latex \left{ \right} 环境不能自动换行 1. 问题描述2.解决方法 1. 问题描述 可以看到 V { v 1 , v 2 , . . . , v g } V\left\{v_1, v_2, ..., v_g \right\} V{v1​,v2​,...,vg​}没有自动换行。 2.解决方法 在合适换行的位置加入\right.\\ \left.&#xff0c;手动换行。…

连锁收银系统一定需要具备会员营销功能

连锁收银系统不只是一个收银工具&#xff0c;它需要具备会员营销功能&#xff0c;这取决于连锁店的经营策略和目标群体。会员营销功能通常用于吸引和留住忠实客户&#xff0c;通过积分、折扣、专属优惠等方式提升客户的消费频率和金额。连锁店的经营模式侧重于会员制度或者目标…

Golang | Leetcode Golang题解之第257题二叉树的所有路径

题目&#xff1a; 题解&#xff1a; func binaryTreePaths(root *TreeNode) []string {paths : []string{}if root nil {return paths}nodeQueue : []*TreeNode{}pathQueue : []string{}nodeQueue append(nodeQueue, root)pathQueue append(pathQueue, strconv.Itoa(root.V…

PDF文件压缩怎么弄?这3个方法轻松解决

PDF文件压缩怎么弄&#xff1f;PDF文件压缩在日常办公和学习中扮演着至关重要的角色&#xff0c;它不仅仅是减少文件占用的磁盘空间那么简单&#xff0c;更是提升了文件在云存储、电子邮件发送以及跨设备传输时的效率与便捷性。通过压缩&#xff0c;我们能够更快地共享大型文档…

【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…