自定义Bean转换工具类

news2024/12/28 20:28:55

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.coloradmin.cn/o/1940399.html

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

相关文章

LeetCode 739, 82, 106

文章目录 739. 每日温度题目链接标签思路代码 82. 删除排序链表中的重复元素 II题目链接标签思路代码 106. 从中序与后序遍历序列构造二叉树题目链接标签思路二叉树的三种遍历值与索引的映射对于后序遍历的使用对于中序遍历的使用 代码 739. 每日温度 题目链接 739. 每日温度…

完整创建一个vite前端项目

目录 1.先创建一个vite项目 2.下载第三方依赖 ① 安装路由vue-router ② 安装vuex全局数据管理 ③ 安装element-plus ④ 安装element-plus图标 ⑤ 安装axios发送请求 ⑥ 完整main.js代码模板 3.开发组件 4.登陆页面开发用例 5. 完整项目代码 废话少说&#xff0c;直接…

【C++】 string类的模拟实现

目录 一、我们先创建三个文件分别为 String.h&#xff08;声明&#xff09;、String.cpp&#xff08;定义&#xff09;、teat.cpp&#xff08;测试&#xff09; 二、成员函数 构造函数与析构函数 &#x1f31f;string() &#x1f31f;string(const char* str) &#x1f…

探索SideLlama:浏览器中的本地大型语言模型

在这个数字化时代&#xff0c;浏览器扩展程序已经成为我们日常网络体验中不可或缺的一部分。它们不仅为我们提供了便利&#xff0c;还为我们的浏览体验增添了更多的功能和乐趣。今天&#xff0c;我要介绍的是一个全新的Chrome浏览器扩展程序——SideLlama&#xff0c;它能够让你…

SOMEIPSRV_ONWIRE_03: 从请求中复制请求ID到响应消息

测试目的&#xff1a; 确保服务器在生成响应消息时将请求ID从请求消息复制到响应消息。 描述 本测试用例旨在验证DUT&#xff08;Device Under Test&#xff0c;被测试设备&#xff09;在处理SOME/IP请求和生成相应响应时&#xff0c;是否将请求消息中的请求ID正确复制到了响…

苹果相册里的视频删除了怎么恢复?只需3招,轻松拿捏

一个不小心手滑把苹果手机相册里的视频删除了怎么办&#xff1f;删除了是不是再也找不回来了&#xff1f;那些美好的回忆是不是也从此消散了&#xff1f;当然不是&#xff01;苹果手机相册里的视频删除了怎么恢复&#xff1f;小编这里有3个秘诀&#xff0c;可以让它重新出现在你…

中智讯与黄淮学院共建“嵌入式边缘计算创客工坊”正式签约

7月13日&#xff0c;中智讯(武汉)科技有限公司与黄淮学院共建“嵌入式边缘计算创客工坊”正式签约。出席签约仪式的有黄淮学院电子信息学院党委书记魏迎军同志、院长高有堂教授、副院长吴忠林教授、党委副书记从卫东同志及全体教职工&#xff0c;中智讯(武汉)科技有限公司技术副…

Jackson详解

文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…

Nexus3 批量上传 jar 包、pom文件

Nexus3 Maven 私服搭建及各种使用 详见**Maven私服搭建及各种使用汇总2020** Maven 配置 Nexus 私服 在 Maven 项目中配置 Nexus 私服&#xff0c;需要在项目的 pom.xml 或 maven 的 settings.xml 文件中添加 Nexus 仓库的配置。 示例&#xff1a; 以下是一个项目的 pom.xml…

word 设置目录中英文字母大写改为小写

选中目录右击“字体”&#xff0c;设置“小型大写字母”。

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

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

图解 Hadoop 架构 |Yarn、MapReduce

Hadoop Hadoop 是什么 Hadoop 是由 Apache 基金会所开发&#xff0c;维护的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说&#xff0c;Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈&#xff0c;包括 MapReduce&#xff0c;HDFS&#xf…

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

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

Lowpoly Style Alpine Woodlands Environment(高山林地)

v1.1中的新增功能:添加了地形的额外网格。 使用此资产包构建您自己的山地或林地级别和景观!还包括一个demoscene。该包包含许多资产:植物、岩石、山脉、树木、建筑、营地和帐篷、墙壁、粒子效果等等。 性能:所有东西都共享一种材质和一种纹理,因此可以将所有东西分批在一起…

0401-403组合逻辑电路的分析设计竞争冒险

组合逻辑电路的分析设计&竞争冒险 4.组合逻辑电路1.目录2.教学基本要求3.序 关于组合逻辑电路 4.1组合逻辑电路分析与设计一、组合逻辑电路分析二、组合逻辑电路的分析步骤&#xff1a;三、组合逻辑电路的分析举例例1 奇校验电路例2.对输入的二进制求反码例3.一个工厂发电的…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

2024年steam好玩的新游:《哈迪斯2》《雨中冒险: 回归》等

今天已经有不少新游上线&#xff0c;下面为大家整理了2024年好玩的steam游戏&#xff0c;一起来看看。 2024值得一玩的新游 1、《哈迪斯2》 哈迪斯2&#xff08;Hades II&#xff09;是Supergiant Games继其广受好评的作品《哈迪斯》之后开发的一款动作角色扮演游戏。 在《哈…

纯净IP的判断标准及代理深度分析

今天&#xff0c;我们测评团队将带大家深入探讨纯净IP的判断标准&#xff0c;并通过实测数据&#xff0c;对极光静态代理与独享云创这两家服务商进行深度剖析&#xff0c;为你揭秘如何挑选那些真正值得信赖的IP代理服务。 一、纯净IP的判断标准 历史记录检查&#xff1a;一个好…

@Resource注解 和 @Autowired 注解的区别!

Resource注解 和 Autowired 注解的区别! 前言: 实习时候第一次拉取了企业级代码(微服务),发现基本上都是Resource注解,自己之前平时没仔细思考 就是按照自己的习惯用的Autowired,平时开发也是单体架构的系统. 理解: Autowired Autowired是spring提供的一个注解,默认是根据类型…

[RL] 马尔可夫决策过程基础

文章结构 目录 一、马尔可夫过程 马尔可夫性质 二、马尔可夫奖励过程 回报&#xff08;Return&#xff09; 贝尔曼方程&#xff08;Bellman equation&#xff09; 贝尔曼方程解析解 蒙特卡洛方法​ 马尔可夫决策过程​ MDP和马尔可夫过程/马尔可夫奖励过程的区别 马…