后端开发必知:BeanUtils 如何在 DTO 与 VO 间巧妙复制数据

作为一名后端开发者,我们深知数据安全的重要性,尤其是像手机号、身份证号等关键数据

为了防止关键数据泄露,JAVA领域,基本都采用了 VO(Value Object)和 DTO(Data Transfer Object)的模式,VO(Value Object)通常只会回传最关键的属性,而DTO(Data Transfer Object)一般则包含表的所有字段数据。因此,DTO和VO之间通常需要进行关键字段的数据复制。今天,我们就来分享一个工具类——BeanUtils,并剖析其数据复制的源码。

一、BeanUtils工具类

BeanUtils是Spring框架提供的用于处理JavaBean的静态工具方法类,如实例化bean、检查bean属性类型、复制bean属性等。

1. 核心方法

  • instantiateClass(Class clazz):根据给定的类创建一个新的实例。
  • copyProperties(Object source, Object target, String… ignoreProperties):将一个对象的属性值复制到另一个对象中,可以指定忽略的属性。
  • findPropertyType(String propertyName, @Nullable Class<?>… beanClasses):获取指定Bean属性的类型。

2. 数据复制场景

想象一下这样的场景:我们从数据库中获取了完整的用户数据,存储在 DTO 中。但是,当我们要将这些数据展示给前端页面时,我们并不希望将所有的字段都暴露出去,只需要传递一些关键的信息。这时,我们就可以利用 BeanUtils 工具类,将 DTO 中这些关键的属性复制到 VO 中,然后将 VO 传递给前端。这样,既保证了数据的安全性,又提高了数据传输的效率

二、copyProperties方法分析

copyProperties方法的核心可总结为两步。

  1. 获取目标对象及其getter和setter方法
Class<?> actualEditable = target.getClass();
PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
  1. 遍历目标对象的所有属性,并通过反射机制从源对象中获取对应属性的值,最后赋值给目标对象
for (PropertyDescriptor targetPd : targetPds) {Method writeMethod = targetPd.getWriteMethod();// 确保write方法存在if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());if (sourcePd != null) {Method readMethod = sourcePd.getReadMethod();// 确保read方法存在if (readMethod != null &&ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {try {// 设置读方法的可访问性if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {readMethod.setAccessible(true);}// 获取source类对应属性的值Object value = readMethod.invoke(source);// 设置写方法的可访问性if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {writeMethod.setAccessible(true);}// 赋值writeMethod.invoke(target, value);}catch (Throwable ex) {throw new FatalBeanException("Could not copy property '" + targetPd.getName() + "' from source to target", ex);}}}}}

通过上述步骤,copyProperties方法能够有效地实现对象间属性值的复制,同时支持忽略指定属性,从而满足不同场景下的需求。

三、总结

BeanUtils类的copyProperties方法,在保证数据安全的前提下,高效地实现了 DTO 和 VO 之间的数据复制。在实际开发中,我们要充分理解和掌握它的原理和使用方法,同时注意可能出现的问题,如属性名称匹配、类型兼容性((《MyBatis 数据表与实体映射的隐藏陷阱》))和性能优化等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56109.shtml

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

相关文章

MySQL UDF提权原理

文章目录 前言一、MySQL架构二、什么是UDF三、UDF提权原理四、MSF实战参考 前言 看了许多视频和文章&#xff0c;对UDF提权讲得都不是很清楚&#xff0c;遂搜索了一下MySQL的基础知识&#xff0c;总结了一下&#xff0c;供各位初学的师傅参考。 一、MySQL架构 首先&#xff…

【人工智能】探索最强AI工具:实际应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI工具已经深入到人们日常生活和工作的方方面面。这些工具不仅提高了生产力&#xff0c;还改变了我们解决问题和处理信息的方式。在中文互联网和国际市场中&#xff0c;众多AI工具已成为人们工作、学习、创作…

深度学习 nd.arange()

在 MXNet 中&#xff0c;nd.arange() 是一个用于生成均匀间隔的数值数组的函数。它的功能类似于 NumPy 的 arange() 函数。下面是 nd.arange() 的一些基本用法&#xff1a; 语法 mx.nd.arange(start, stopNone, step1, dtypeNone, ctxNone) 参数 start&#xff1a;可选&…

entity,pojo,vo,dto 详解

在Java项目中&#xff0c;包名通常用于组织代码&#xff0c;使其更加清晰和易于维护。entity、pojo、vo和dto是常见的包名&#xff0c;它们各自有不同的含义和用途。下面将详细解释这些包名的含义&#xff0c;并提供一个示例&#xff0c;帮助你更好地理解它们在项目中的应用。 …

C# Json文件写入、读取 ,Json文件序列化、反序列化

在C#中&#xff0c;处理JSON文件的写入、读取、序列化和反序列化是一个常见的需求&#xff0c;特别是在需要与前端JavaScript应用进行数据交换或配置文件管理的场景中。下面将分别介绍如何使用.NET自带的System.Text.Json命名空间&#xff08;从.NET Core 3.0开始引入&#xff…

【部署篇】Redis-03主从模式部署(源码方式安装)

一、准备主机 主从模式只是解决了数据备份容灾并不能解决单点故障问题&#xff0c;生产环境中需要在主从模式基础上增加哨兵&#xff0c;实现主节点宕机时自动将其中一个重节点设置为新的主节点。 主机IP角色说明192.168.128.31master&#xff0c;主节点可读写。192.168.128…

Ultralytics_yolov10目标检测,预处理函数入口

日期&#xff1a;2024.10.7. 随着Ultralytics的更新&#xff0c;yolov5-v11可以统一使用Ultralytics包体&#xff0c;我之前分析的yolov5关键代码定位在Ultralytics中不适用&#xff0c;这篇博客更新一下。 1. Ultralytics包体版本&#xff1a; $ pip list | grep ultralytic…

git删除错误的commit

文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图&#xff1a; 当某次失误造成commit的版本有问题&#xff0c;需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录&#xff0c;可以看到HEAD-…

公网IP and 局域网IP

Part 1 Java获取公网IP 在Java中获取公网IP地址&#xff08;即外部IP地址&#xff0c;而非局域网地址&#xff09;通常需要借助外部服务&#xff0c;因为Java本身没有直接获取公网IP地址的API。你可以通过向一个外部服务发送HTTP请求&#xff0c;然后解析其返回的响应来获取公…

JAVA毕业设计191—基于Java+Springboot+vue的电子产品商城管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的电子产品商城管理系统(源代码数据库)191 一、系统介绍 本项目前后端不分离&#xff0c;分为用户、管理员两种角色 1、用户&#xff1a; 注册、登录、商品…

C++设计模式——代理模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器&#xff0c;能够接收客户端的请求&#xff0c;并代表客户端向服务器发起请求&#xff0c;然后将服…

金蝶云星空与金蝶云星空对接集成采购订单查询连通采购订单新增(采购订单)

金蝶云星空与金蝶云星空对接集成采购订单查询连通采购订单新增(采购订单) 对接系统金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用…

git stash命令的使用

工作中&#xff0c;若正在一个分支进行开发&#xff0c;而另一个分支出现bug&#xff0c;这时候&#xff0c;不想commit代码&#xff0c;我们就可以使用git stash将代码暂时存储起来&#xff0c;git stash就相当于一个临时暂存区&#xff0c;这样git status就会发现工作区是干净…

YOLOv10改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv10目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注意力引导通道注意力增…

HTTP 协议详解

HTTP 协议是 Web 的基石&#xff0c;它定义了客户端和服务器之间的通信规则。本文将深入地探讨 HTTP 的核心概念&#xff0c;包括工作原理、请求方法、状态码以及不同 HTTP 版本的演进。 一、HTTP 的工作原理 HTTP 协议基于客户端-服务器模型&#xff0c;遵循请求-响应的循环&…

opencv学习:CascadeClassifier和detectMultiScale算法进行人脸识别

CascadeClassifier CascadeClassifier 是 OpenCV 提供的一个用于对象检测的类&#xff0c;它基于Haar特征和AdaBoost算法。它能够识别图像中的特定对象&#xff0c;比如人脸、眼睛、微笑等。CascadeClassifier 需要一个预训练的XML分类器文件&#xff0c;该文件包含了用于检测…

Mac 需要杀毒软件?

大部分 mac用户普遍认为 Apple mac 不受病毒和恶意软件的影响。这导致许多 Mac 用户误以为无需为 Mac 安装防病毒软件&#xff0c;但事实并非如此。 在这篇文章中&#xff0c;将深入探讨 Mac 安全性的细节&#xff0c;探索针对 Apple 设备的恶意软件类型&#xff0c;并为您…

Python和CUDA(C++)量子退火和伊辛二次算法模型

&#x1f3af;要点 简化量子退火或离散优化算法处理&#xff0c;使用张量网络模拟和动态系统方法及神经网络逼近。实现并行退火算法和CUDA支持下穷举搜索法。使用大都会算法模拟二维自旋玻璃伊辛模型并测量磁化率、比热容和能量。对比其他组合优化解方法&#xff0c;使用英伟达…

Windows 安装 Maven 并配置环境变量

一、简介 Maven 是一款基于 Java 平台的项目管理和整合工具&#xff0c;用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给 Maven 管理&#xff0c;整个过程就是构建。 二、安装 Java JDK Maven 依赖 Java JDK&#xff0c;如果本机没有安装过 Java 的…

C#使用PdfSharp生成PDF文件实例详解

许多项目开发中需要生成PDF, 常规办法使用官方提供的Microsoft.Office.Interop.Worddll插件,但是这种方法需要完全安装OFFICE,另外版本不一致还会出现很多错误。一般不推荐使用。 下面介绍几种巧妙的用法,定能事半功倍。 本文使用PDFsharp完成功能。 PDFsharp一款开源的…