Dozer 轻松高效玩转DTO(Data Transfer Object,属性名不同或相同都可以转换)

Spring Boot实体与DTO转换:手动、BeanUtils与MapStruct全解析 在Java企业级开发中,数据传输对象(DTO)与实体(Entity)的分离是保障应用分层清晰、数据安全与性能优化的核心实践。DTO作为层间数据交换的契约,其核心原理在于通过定制化的数据结构,精确控制数据暴露范围,避免敏感信息泄露与冗余查询,从而提升系统安全性与响应效率。这一技术价值在微服务架构与RESTful API设计中尤为凸显,广泛应用于用户信息脱敏、API接口定制、服务间通信等场景。本文聚焦Spring Boot框架,深入剖析实体转DTO的多种实现方案,其中MapStruct以其编译时生成原生代码的特 阅读详情

1.现状

对于分布式系统,需要在不同系统之间传递与转换域对象。因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统。传统上,数据对象之间的映射通过手工编码(getter/setter)的方式实现,或对象组装器(或转换器)来解决。我们可能会开发某种自定义映射框架来满足我们的映射转换需求,但这一切都显得不够灵巧。

Dozer
Dozer 是 Java Bean 到 Java Bean 映射器,它以递归方式将数据从一个对象复制到另一个对象。

通常,这些 Java Bean 将具有不同的复杂类型。Dozer 支持简单属性映射,复杂类型映射,双向映射,隐式和显式映射以及递归映射。
Dozer不仅支持属性名称之间的映射,还支持在类型之间自动转换。大多数转换方案都是开箱即用的,但 Dozer 还允许您通过 XML / API 的方式指定自定义转换。
下图描绘了 Dozer 可以插入到架构中的一些常见区域。请注意,它通常用于边界(进入/退出)。 Dozer 将确保数据库中的内部域对象不会流入外部表示层或外部使用者。它还可以帮助将域对象映射到外部 API 调用,反之亦然,现在不用纠结这个图,看完下面的测试用例回看该图,柳暗花明, 文末有完整测试用例

在这里插入图片描述
2.集成 Dozer
使用 Dozer 的方式很简单,如果你使用 Maven,添加依赖到 pom.xml 中即可

<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-core</artifactId>
    <version>6.4.0</version>
</dependency>

如果你使用 Spring Boot,引入 Dozer starter 即可:

<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-spring-boot-starter</artifactId>
    <version>6.2.0</version>
</dependency>

3,使用 Dozer
默认使用
Dozer starter 默认为我们注入了 Dozer Mapper,可以直接使用,另外,文章中所有测试用例中使用 Lombok 注解简化代码
3.1)当属姓名不通的,通过直接映射
第1步,不同属性名的在被转换bean上(Do)注解@Mapping(“vo里该字段名称”)
在这里插入图片描述

在这里插入图片描述
list转换:

package com.xunxiao.common.utils;

import com.github.dozermapper.core.DozerBeanMapperBuilder;
import com.github.dozermapper.core.Mapper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

/**
 * dozer 转换器
 * @author zq
 */
@Component
public class GeneralConvertor {

    //持有Dozer单例, 避免重复创建DozerMapper消耗资源.
    @Resource
    public static final Mapper mapper = DozerBeanMapperBuilder.buildDefault();

    /**
     * List  实体类 转换器
     *
     * @param source 原数据
     * @param clz    转换类型
     * @param <T>
     * @param <S>
     * @return
     */
    public <T, S> List<T> convertor(List<S> source, Class<T> clz) {
        if (source == null) return null;
        List<T> map = new ArrayList<>();
        for (S s : source) {
            map.add(mapper.map(s, clz));
        }
        return map;
    }

    /**
     * Set 实体类 深度转换器
     *
     * @param source 原数据
     * @param clz    目标对象
     * @param <T>
     * @param <S>
     * @return
     */
    public <T, S> Set<T> convertor(Set<S> source, Class<T> clz) {
        if (source == null) return null;
        Set<T> set = new TreeSet<>();
        for (S s : source) {
            set.add(mapper.map(s, clz));
        }
        return set;
    }

    /**
     * 实体类 深度转换器
     *
     * @param source
     * @param clz
     * @param <T>
     * @param <S>
     * @return
     */
    public <T, S> T convertor(S source, Class<T> clz) {
        if (source == null) return null;
        return mapper.map(source, clz);
    }

    public void convertor(Object source, Object object) {
        mapper.map(source, object);
    }

    public <T> void copyConvertor(T source, Object object) {
        mapper.map(source, object);
    }


}
  List<InterxxxxxxxxxxxxxtItemDo> interestDoList = intxxxxxxxxxxxxxntItemService.getInterexxxxxxxxxst(ixxxxxxxxntItemPage.getIxxxxxxxd());
        List<InterxxxxxxxxxxxxxmVo> resultVoList = null;
        //Do列表不为null,进行Do->Vo转换
        if(interestDoList!=null){
            resultVoList = this.convertor.convertor(interestDoList, InterestContentItemVo.class);
        }else{
            return CommonPage.failed("xxxxxxxxxx");
        }
线阵相机标定必看:如何用Halcon实现亚毫米级精度测量(以HC050标定板为例) 本文以HC050标定板为例,详细阐述了如何利用Halcon实现线阵相机的高精度标定,以达到亚毫米级测量。文章深入剖析了线阵相机标定的核心原理、面临的独特挑战,并提供了从硬件搭建、图像采集到Halcon软件实操的完整路径,重点解析了运动参数设置、精度验证及常见问题排错,为精密测量应用提供系统解决方案。 阅读详情

相关推荐

告别WSL!用AMD ROCm7在Windows上跑ComfyUI,我的幻x2025 AI Max+ 395体验与性能调优心得

本文详细介绍了在搭载AMD Ryzen AI Max+ 395处理器的幻x2025笔记本上,如何通过ROCm7在Windows原生环境下高效运行ComfyUI,并分享了一系列性能调优技巧和实战经验,帮助开发者摆脱WSL束缚,提升AI创作效率。

weixin_29102619的博客 1119

怎么取出对象中的属性名_「原创」 属性名不完全一致的JavaBean对象之间相互拷贝

不同JavaBean之间的拷贝随着服务分层的发展用得越来越多. 而不同服务层都有自己服务层独有的bean, 例如DTO, BO, DO等等.这些Bean中的元素大多数都是相同的,但是由于各种原因里面的属性名称可能会有细微差别.比如 cno 与 customNo 等价, password和pwd等价, 等等.通常我们会使用String的BeanUtils来转换这些对象. 而这些不同属性名的属性会通过...

weixin_39781783的博客 359

论文理解【LLM-OR】——【SIRL】Solver-Informed RL: Grounding Large Language Models for Authentic Optimization M

本文提出第一种针对基于 LLM 的 OR 问题建模和求解任务的 RLVR 方法,其基于求解器得到可验证奖励,设计了 Partial KL 强化目标函数和两阶段奖励课程训练方法,达成了 SOTA 性能

佚失的诗篇 883

面试题——当实体类中的属性名和表中的字段名不一样,如何将查询的结果封装到指定 pojo?

我们可以通过标签来将数据库表中字段映射到对应的实体类属性上,完成数据库查询数据的封装,如果实体类的属性中存在自定义类属性,那么也可以通过resultMap进行数据的层层映射,封装到对应自定义类中的基本类型数据中。的时候,应该注意实体类的属性名尽量和表的字段名尽量相同,如果不同将会导致MyBatis无法完成数据的封装,但是在软件开发过程中,数据库的创建和软件环境的搭建不可能是同一个人,实体类属性名和数据库的字段名不同那就在所难免。将数据库列与 JavaBean 中的属性进行映射。

weixin_65824274的博客 1106

M×N扫描序列图像拼接、大视场图像拼接、全景图像拼接、2D网格拼图方法、累计误差消除(显微图像/航拍图像等)

M×N序列图像完整拼接方法前言一、最朴实的一般方法二、广度优先搜索算法1.引入库2.读入数据整体路径优化算法 前言 1、网上有很多介绍图像两两拼接的算法,但是缺少对M×N张子图两两相对位置关系获得整体误差较小,肉眼下无明显错位的完整图像的算法实现。 2、由于拼接算法的不稳定可能会产生不同程度的误差,那么如何需要选择(搜索)误差较小拼接路径。 一、最朴实的一般方法 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、广度优先搜索算法 1.引入库 代码如下(示

qq_37764141的博客 5408

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2309

java 两个Dto对象有字段数据不一致可Objects.equals方法却返回了一致?(问题分析与结论)

可以从字节码看到,对父类做了equals比对!你可能和我一样会去对比两个类的差别,最开始的类有@FieldNameConstants注解,后面的没有,但是测试过后,这个加或不加都不影响维持现状,另一个就是base类是否在一个目录下,这个测试了仍然不影响。运行代码得到的结果,是不是有点懵,明明pageNo这个字段的值一个是1,一个是10,为啥equals还能相等呢?到此,你弄懂了为啥这两个对象equals会返回相同,解决办法是加注解声明equals方法要比较父类的equals。我也懵了啊,再去看看字节码。

HumorChen的博客 613

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1496

java中BO,VO,DTO,DO等之间的转换

文章目录1 介绍2 转换2.1 通过get,set方法进行类型转换2.2 基于反射的机制2.3 基于cglib字节码修改 1 介绍 阿里的java代码开发规范中,关于各个层的命名规范是这么定义 这里面有我们比较常见的POJO对应的实体定义格式,其中 VO(View Object):是针对于视图层,用于展示层(前端页面),它的作用是把某个视图需要展示的数据进行封装。 DTO(Data Trans...

zcswl7961的博客 9094

STM32 SAI接口TDM模式实战:8通道音频采集系统搭建全流程(附DMA配置代码)

本文详细介绍了基于STM32 SAI接口TDM模式搭建8通道音频采集系统的全流程。内容涵盖硬件连接设计、CubeMX时钟树与SAI外设的详细配置,并重点解析了TDM模式的核心代码实现与DMA双缓冲机制,提供了完整的配置代码和常见时序问题排查指南,助力开发者高效实现多通道音频传输与处理。

weixin_29192211的博客 505

用 CDS View I_APARToleranceGroup 管理客户与供应商收付差异容差:配置语义、字段解读与 ABAP 落地实践

财务共享服务中心常面临小额差异处理的挑战,SAP通过"客户/供应商容差组"机制实现自动清账规则配置。CDS视图I_APARToleranceGroup将配置数据转化为可查询维度,包含宽限天数、固定现金折扣等关键业务参数。该视图支持按公司代码和容差组查询差异处理策略,可用于报表开发、主数据校验和接口合规检查,帮助财务团队高效管理海量小额交易差异,减少手工操作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 130

java对象相互转化多种实现方式

方式一:MapStruct 是一个代码生成器,它基于约定优于配置的方法,极大地简化了 Java bean 类型之间的映射实现。 生成的映射代码使用普通的方法调用,因此速度快、类型安全且易于理解。 官方文档 https://mapstruct.org/documentation/installation/ 更多使用示例 https://github.com/kevinLuan/mapstruct-examples mapper-struct使用比较灵活,性能非常出色。由于它的实现是通过在开发中生成源代码的

kevin_Luan的专栏 4978

11 指挥AI写C语言/嵌入式基础代码,适配硬件与底层逻辑

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十一篇,正式进入第三阶段多场景实战环节。聚焦**C语言/嵌入式基础代码**生成,结合嵌入式开发的核心需求,讲解如何精准编写指令,指挥AI生成适配硬件、贴合底层逻辑的C语言代码,覆盖嵌入式常用底层功能、硬件适配要点、代码规范,搭配完整指令模板、AI输出示例与实操校验方法,零基础也能快速指挥AI完成嵌入式基础开发,无需死记硬背C语言底层语法。

coreopt的博客 141

Dozer 轻松高效玩转DTO(Data Transfer Object)

现状 对于分布式系统,需要在不同系统之间传递与转换域对象。因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统。传统上,数据对象之间的映射通过手工编码(getter/setter)的方式实现,或对象组装器(或转换器)来解决。我们可能会开发某种自定义映射框架来满足我们的映射转换需求,但这一切都显得不够灵巧。 Dozer Dozer 是 Java Bean 到 Java Bean 映射器,它以...

日拱一兵 3947

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

轻松高效玩转DTO(Data Transfer Object)

点击左上角关注 「日拱一兵」现状对于分布式系统,需要在不同系统之间传递与转换域对象。因为我们不希望外部公开内部域对象,也不允许外部域对象渗入系统。传统上,数据对象之间的映...

日拱一兵 803

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

轻松高效玩转DTO(Data Transfer Object)

点击蓝色“程序猿DD”关注我哟加个“星标”,不忘签到哦转载自公众号:日拱一兵关注我,回复口令获取可获取独家整理的学习资料:-001:领取《Spring Boot基础教程...

程序猿DD 1100

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

PO VO DTO 转换神器替代BeanUtils 了

MapStruct是一个代码生成器,它基于约定优于配置,极大地简化了Java Bean类型之间映射的实现。特点如下:1.基于注解2.在编译期自动生成映射转换代码3.类型安全、高性能、无依赖性、易于理解阅读。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1832

Java-实际开发中,将同样属性的不同-DTO-类优雅映射的最佳实践

业务中使用依赖方 DTO 类所带来的问题 我负责的系统所依赖的部分服务接口需要重构,把对应的接口从 A 服务迁移到了 B 服务,虽然入参出参格式都一样,但包路径完全变了。而原有的 A 服务仍然有接口依赖,所以我必须要兼容两种【类名一样结构几乎一样!】但【包路径完全不同!】的出入参。 但由于我这边的系统代码结构中业务逻辑一直使用了 A 服务提供的 SDK 中的 DTO 定义来做业务参...

lucky_C的博客 3745

Dozer 使用

1.1 什么是dozer?Dozer 是一个对象转换工具。Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。更多详细请参考dozer官网:http://dozer.sourcefo...

To Strive To Seek To Find Not To Yield 192

DozerBeanMapper对象转换(可以两个不同类型的javaBean,只要属性名、数据类型相同既可以转换)

一、maven依赖 <properties> <dozer.version>5.5.1</dozer.version> </properties> ​ <dependencies> <dependency> <groupId>net.sf.dozer</groupId> <artifactId>

li_tiantian的博客 1497

Java基础学习:Dozer映射框架

Dozer是一个Java工具,主要用于在相同类型或不同复杂类型的JavaBean之间进行数据的递归复制。这个工具在分层的J2EE系统中非常有用,尤其是在JavaBean之间的数据拷贝过程中。Dozer的特点包括默认属性映射:如果两个JavaBean的属性名称相同,Dozer会自动将它们进行映射,而无需进行显式配置。自动类型转换:Dozer可以自动处理类型不同的属性映射,只要这些类型在Dozer可理解的范围内。这可以极大地提高开发效率。处理null属性。

玉汝于成 1790

dozer的使用总结

Dozer是一种Java Bean-to-Bean映射框架,它允许简单而灵活地配置Java对象之间的字段映射。Dozer可以映射同一类型的不同对象、不同类型之间的对象、以及对象之间的集合。它还支持许多高级映射选项,例如自定义转换器和逐级映射。Dozer可以用于许多不同的应用程序,包括DAO和WebService。

rqz__的博客 1250

MyBatis:字段名与属性名不同的解决方案

在实际开发中,普通程序员是没有权利定义实体类和DB的,实体类是由架构师或者项目经理定义,而DB则由DBA定义,所以,字段名和属性名很多时候是不一致的。假如不一致,我们执行增删改是没问题的,但是在执行查询时就出现了问题,如下: DB Country类 xml 很明显,实体类里的属性名和DB里的字段名不一致,我们执行查询时,结果如下: 结果 为此,我们有如下两种解决方案:

weixin_41113108的博客 944

如何为同一 DTO 属性指定 2 个名称

前言 我们在《实现DDD领域驱动设计》中谈到过输出 DTO 的最佳实践,其中一条是: 保持输出 DTO 数量最少,尽可能重用。 但是,对于 2 个不同接口输出的同一 DTO 属性,客户端可能需要对应不同的名称,比如: publicclassMyIODTO { [JsonPropertyName("pageNumer")]//用于B接口返回 [JsonPropertyName("pageNum")]//用于A接口返回 publicintPageNu...

寒冰屋的专栏 638

JavaBean之间拷贝利器-Dozer 映射数据类型不一致,级联映射与自定义映射

今天我们来讨论如何使用Dozer映射复杂类型:             1. 数据类型不一致。             2. 级联映射。             3. 自定义映射。     在讨论之前,我们来说说一个朋友在上篇留言中提到的一个问题。估计大家应该都很关心。这个问题就是性能问题。Dozer其实底层使用了现成的BeanUtil,通过反射来映射,况且Dozer应用了Cache技术,

好读书,每有会意,便欣然忘食。 3428

SpringBoot——Dozer实现对象转换

2 DozerUtil对象转换工具类 3 Dozer对象转换配置文件 对象的转换离不开属性与属性间的映射关系。包括不同属性名,同属性名不同属性的类别的之间对象的转换关系。该转换关系离不开dozer的配置xml文件。该文件通常放在resourses 文件夹下,例如新建dozer-mapper.xml...

contact97的博客 971
上一篇: jwt例子
下一篇: 数据湖分析---使用场景
yonhu123java
博客等级 码龄14年 6粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值