SpringBoot2.x 集成 Dozer

article/2025/9/9 7:56:43

Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射。这包括映射需要在元素层面上进行映射的集合属性。可以将Dozer用作两个对象之间属性转换的工具,使用它可以很方便地对项目中的DO、DTO、VO进行相互转换。

本文主要对SpringBoot2.x集成Dozer及其基本使用进行简单总结,其中SpringBoot使用的2.4.5版本。

一、引入依赖

<dependency><groupId>com.github.dozermapper</groupId><artifactId>dozer-spring-boot-starter</artifactId><version>6.5.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<!-- lombok插件 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version>
</dependency>

二、实体类

User类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;import java.util.Date;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.User* @description User* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class User {private Long id;private String name;private Integer age;private String gender;private String email;private Date birthday;
}

UserDTO类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.UserDTO* @description UserDTO* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class UserDTO {private Long userId;private String userName;private Integer userAge;private String gender;private String email;private String birthday;
}

三、编写配置文件

resources/dozer/目录下创建Dozer的全局配置文件global-dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://dozermapper.github.io/schema/bean-mapping"xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mappinghttp://dozermapper.github.io/schema/bean-mapping.xsd"><!-- 全局配置:<date-format>表示日期格式 --><configuration><date-format>yyyy/MM/dd HH:mm:ss</date-format></configuration>
</mappings>

resources/dozer/目录下创建Dozer的映射文件dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://dozermapper.github.io/schema/bean-mapping"xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mappinghttp://dozermapper.github.io/schema/bean-mapping.xsd"><!-- 描述两个类中属性的对应关系,对于两个类中同名的属性可以不映射 --><mapping date-format="yyyy/MM/dd HH:mm:ss"><class-a>com.rtxtitanv.model.User</class-a><class-b>com.rtxtitanv.model.UserDTO</class-b><field><a>id</a><b>userId</b></field><field><a>name</a><b>userName</b></field><field><a>age</a><b>userAge</b></field></mapping>
</mappings>

resources目录下创建application.yml配置文件:

dozer:# 指定Dozer的映射配置文件位置mapping-files:- classpath:dozer/global-dozer.xml- classpath:dozer/dozer.xml

四、创建测试类

创建单元测试类DozerTest

package com.rtxtitanv;import com.github.dozermapper.core.Mapper;
import com.rtxtitanv.model.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.DozerTest* @description Dozer单元测试类* @date 2021/8/18 16:44*/
@Slf4j
@SpringBootTest
class DozerTest {@Resourceprivate Mapper mapper;@Testvoid test1() {UserDTO userDTO = new UserDTO();userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");User user = mapper.map(userDTO, User.class);log.info(user.toString());UserDTO userDTO2 = mapper.map(user, UserDTO.class);log.info(userDTO2.toString());}
}

执行测试方法,发现User和UserDTO相互转换成功:
1

五、Dozer的基本使用

下面对Dozer的一些基本使用进行总结。Dozer支持注解、API、XML三种映射配置方式,XML方式比较常用,前面使用的也是XML映射配置方式。XML映射配置中mapping元素的map-id属性可以设置该映射的标识,通过此标识来确定使用该映射关系。

dozer.xml中新增以下配置:

<!-- map-id:映射的标识,通过此标识来确定使用该映射关系 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user"><class-a>com.rtxtitanv.model.User</class-a><class-b>com.rtxtitanv.model.UserDTO</class-b><field><a>id</a><b>userId</b></field><field><a>name</a><b>userName</b></field><field><a>age</a><b>userAge</b></field>
</mapping>

新增以下测试方法:

@Test
void test2() {UserDTO userDTO = new UserDTO();userDTO.setUserId(2L).setUserName("MaChao").setGender("男").setUserAge(21).setEmail("machao@xxx.com").setBirthday("2000/6/15 08:45:20");User user = mapper.map(userDTO, User.class, "user");log.info(user.toString());
}

执行测试方法,发现转换成功:
2
在调用map方法时也可以直接指定要转换的目标对象。新增以下测试方法:

@Test
void test3() {UserDTO userDTO = new UserDTO();userDTO.setUserId(3L).setUserName("LiuBei").setGender("男").setUserAge(30).setEmail("liubei@xxx.com").setBirthday("1991/1/20 13:36:55");User user = new User();mapper.map(userDTO, user, "user");log.info(user.toString());
}

执行测试方法,发现转换成功:
3
通过field-exclude标签可以设置不想进行转换的属性,这些属性在进行转换时会被自动排除。

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-exclude"><class-a>com.rtxtitanv.model.User</class-a><class-b>com.rtxtitanv.model.UserDTO</class-b><field><a>id</a><b>userId</b></field><field><a>name</a><b>userName</b></field><field><a>age</a><b>userAge</b></field><field-exclude><a>email</a><b>email</b></field-exclude>
</mapping>

新增以下测试方法:

@Test
void test4() {UserDTO userDTO = new UserDTO();userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");User user = mapper.map(userDTO, User.class, "user-exclude");log.info(user.toString());
}

执行测试方法,发现email属性被成功排除:
4

Dozer中的映射方式默认都是双向映射,如果想让转换不可逆,即只需要单向转换,可以设置mapping元素的type属性为one-way来开启单向映射。

dozer.xml中新增以下配置:

<!-- type="one-way"将映射设置为单向映射 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-oneway" type="one-way"><class-a>com.rtxtitanv.model.UserDTO</class-a><class-b>com.rtxtitanv.model.User</class-b><field><a>userId</a><b>id</b></field><field><a>userName</a><b>name</b></field><field><a>userAge</a><b>age</b></field>
</mapping>

新增以下测试方法:

@Test
void test5() {UserDTO userDTO = new UserDTO();userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");User user = mapper.map(userDTO, User.class, "user-oneway");log.info(user.toString());UserDTO userDTO2 = mapper.map(user, UserDTO.class, "user-oneway");log.info(userDTO2.toString());
}

执行测试方法,发现只有UserDTO转换为User成功:
5
当两个实体类中都嵌套有能够互相转换的实体类型属性时,也可以进行相互转换。

创建Order类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.Order* @description Order* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class Order {private Long id;private String number;private String description;private User user;
}

创建OrderDTO类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.OrderDTO* @description OrderDTO* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class OrderDTO {private Long orderId;private String orderNumber;private String orderDescription;private UserDTO userDTO;
}

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="order"><class-a>com.rtxtitanv.model.Order</class-a><class-b>com.rtxtitanv.model.OrderDTO</class-b><field><a>id</a><b>orderId</b></field><field><a>number</a><b>orderNumber</b></field><field><a>description</a><b>orderDescription</b></field><field><a>user</a><b>userDTO</b></field>
</mapping>

新增以下测试方法:

@Test
void test6() {OrderDTO orderDTO = new OrderDTO();UserDTO userDTO = new UserDTO().setUserId(6L).setUserName("DiaoChan").setGender("女").setUserAge(18).setEmail("diaochan@xxx.com").setBirthday("2003/12/27 23:10:36");orderDTO.setOrderId(1L).setOrderNumber("78956328").setOrderDescription("二两麻辣牛肉面").setUserDTO(userDTO);Order order = mapper.map(orderDTO, Order.class, "order");log.info(order.toString());OrderDTO orderDTO2 = mapper.map(order, OrderDTO.class, "order");log.info(orderDTO2.toString());
}

执行测试方法,发现Order和OrderDTO相互转换成功:
6
Dozer还可以对深层属性进行映射,即深度映射。例如一个对象中的String类型属性可以与另一个对象中嵌套的对象的属性进行映射。

创建UserInfo类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.UserInfo* @description UserInfo* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class UserInfo {private String gender;private String email;private String birthday;
}

创建UserInfoDTO类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.UserInfoDTO* @description UserInfoDTO* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class UserInfoDTO {private Long userId;private String userName;private Integer userAge;private UserInfo userInfo;
}

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-deep-mapping"><class-a>com.rtxtitanv.model.UserInfoDTO</class-a><class-b>com.rtxtitanv.model.User</class-b><field><a>userId</a><b>id</b></field><field><a>userName</a><b>name</b></field><field><a>userAge</a><b>age</b></field><field><a>userInfo.gender</a><b>gender</b></field><field><a>userInfo.email</a><b>email</b></field><field><a>userInfo.birthday</a><b>birthday</b></field>
</mapping>

新增以下测试方法:

@Test
void test7() {UserInfo userInfo = new UserInfo();userInfo.setGender("男").setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");UserInfoDTO userInfoDTO = new UserInfoDTO();userInfoDTO.setUserId(1L).setUserName("ZhaoYun").setUserAge(20).setUserInfo(userInfo);User user = mapper.map(userInfoDTO, User.class, "user-deep-mapping");log.info(user.toString());
}

执行测试方法,发现UserInfoDTO成功转换为User:
7
Dozer还支持注解方式配置映射,使用@Mapping注解可以进行一些简单的映射处理。

创建UserEntity类:

package com.rtxtitanv.model;import com.github.dozermapper.core.Mapping;
import lombok.Data;
import lombok.experimental.Accessors;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.UserEntity* @description UserEntity* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class UserEntity {@Mapping(value = "userId")private Long id;@Mapping(value = "userName")private String name;@Mapping(value = "userAge")private Integer age;private String gender;private String email;private String birthday;
}

@Mapping只需要在源类中指定目标类中对应的属性即可。

创建UserVO类:

package com.rtxtitanv.model;import lombok.Data;
import lombok.experimental.Accessors;import java.util.Date;/*** @author rtxtitanv* @version 1.0.0* @name com.rtxtitanv.model.UserVO* @description UserVO* @date 2021/8/18 16:45*/
@Accessors(chain = true)
@Data
public class UserVO {private Long userId;private String userName;private Integer userAge;private String gender;private String email;private Date birthday;
}

新增以下测试方法:

@Test
void test8() {UserEntity userEntity = new UserEntity();userEntity.setId(1L).setName("ZhaoYun").setGender("男").setAge(20).setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");UserVO userVO = mapper.map(userEntity, UserVO.class);log.info(userVO.toString());
}

执行测试方法,发现转换成功:
8

代码示例

  • Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer
  • Gitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer

http://chatgpt.dhexx.cn/article/qDWbQpCN.shtml

相关文章

java dozer 官网,Dozer数据对象转换神器

首先&#xff0c;为什么要进行数据转换&#xff1f; 在一个分层的体系结构中&#xff0c;经常会使用DTO、PO、VO等封装数据&#xff0c;封装数据到特定的数据对象中&#xff0c;然而在很多情况下&#xff0c;某层内部的数据是不允许传递到其它层&#xff0c;不允许对外暴露的&a…

SpringBoot 整合 Dozer 映射框架

SpringBoot 整合 Dozer 映射框架 1. Dozer 介绍2. 为什么要使用映射框架 Dozer3. Dozer 映射框架的使用 1. Dozer 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器&#xff0c;它递归地将数据从一个对象复制到另一个对象。Dozer 是用来对两个对象之间属性转换的工具&#…

Dozer的学习

Dozer的学习 此教程基于黑马程序员Java品达通用权限项目&#xff0c;哔哩哔哩链接&#xff1a;https://www.bilibili.com/video/BV1tw411f79E?p44 1.dozer介绍 Dozer是Java Bean到Java Bean映射器&#xff0c;它以递归方式将数据从一个对象复制到另一个对象。 dozer是用来对…

SpringBoot Dozer

文章目录 Dozerspringboot 配置 Dozer演示Dozer工具接口和实现类全面测试项目实战演示 Dozer Dozer是什么? Dozer是一个JavaBean映射工具库。 它支持简单的属性映射&#xff0c;复杂类型映射&#xff0c;双向映射&#xff0c;隐式显式的映射&#xff0c;以及递归映射。 它支…

Dozer的使用(整合springboot)

dozer是实体类与实体类之间转换的工具&#xff0c;下面是简单操作配置 引入依赖&#xff1a; <!--dozer 实体类转换工具--><dependency><groupId>net.sf.dozer</groupId><artifactId>dozer-spring</artifactId><version>5.5.1<…

【JAVA】Dozer 介绍及快速入门教程

文章目录 概述使用安装入门XML 映射注解映射SpringBoot 集成 结语 概述 Dozer 是什么? Dozer 是 Java Bean 到 Java Bean 的映射器&#xff0c;他以递归的方式将数据从一个对象复制到另一个对象。 它支持简单的属性映射&#xff0c;复杂类型映射&#xff0c;双向映射&#…

1.Dubbo教程

转自&#xff1a;https://blog.csdn.net/hellozpc/article/details/78575773 2. 什么是dubbo 2.1. 简介 DUBBO是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;是阿里巴巴SOA服务化治理方案的核心框架&#xff0c;每天为2,000个服务…

黑马程序员Dubbo快速入门,Java分布式框架dubbo教程

分布式系统中的相关概念 &#xff08;一&#xff09;互联网项目架构目标-特点 &#xff08;二&#xff09;互联网项目架构目标-目标 &#xff08;三&#xff09;集群和分布式 &#xff08;四&#xff09;架构演进 Dubbo概述 &#xff08;一&#xff09;dubbo概述 1、dub…

Dubbo快速入门教程

Dubbo入门教程 1 、Dubbo概述 DUbbo架构 2、Dubbo快速入门 Zookeeper 安装传统的模块化开发Duboo入门小案例 修改Service模块代码修改WEB模块代码增加公共的接口模块 3、Dubbo高级特性 dubbo-admin管理平台 dubbo-adminm安装 一、dubbo-admin安装二、dubbo-admin简单使用 序…

dubbo教程总结(springboot+dubbo)

概述 Apache Dubbo 是一款微服务开发框架&#xff0c;它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着&#xff0c;使用 Dubbo 开发的微服务&#xff0c;将具备相互之间的远程发现与通信能力&#xff0c; 同时利用 Dubbo 提供的丰富服务治理能力&#xff0c;可以实现诸…

Dubbo入门详细教程

什么是Dubbo&#xff1f; Dubbo 是阿里开源的远程服务调用(RPC)的分布式框架&#xff0c;提供了 SOA 服务治理方案;它的架构主要有五个角色/核心组件&#xff0c;分为是 Container(容器)、Provider(服务的提供方)、Registry(注册中心)、Consumer(服务的消费方)、Monitor(监控中…

dubbo 教程

&#xfeff;&#xfeff; 先给出阿里巴巴dubbo的主页&#xff1a;http://code.alibabatech.com/wiki/display/dubbo/Home-zh 自己的demo下载地址&#xff1a;http://download.csdn.net/detail/u012049463/6763315 1. Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&…

dubbo使用教程(可直接应用于企业开发)

本dubbo使用教程基于zookeeper-3.4.9搭建&#xff0c;包含服务提供者DubboProvider、和消费者DubboConsumer&#xff0c;可直接在Tomcat上运行。DubboProvider对外开放2个接口&#xff0c;DubboConsumer调用DubboProvider&#xff0c;并对外暴露HTTP服务。DubboProvider还提供了…

Dubbo快速入门

前言&#xff1a;本文需要建立在博主的环境之上来进行&#xff0c;大家也可以用自己的环境测试一下看能不能行得通&#xff0c;如果可以的话请在下方评论&#xff0c;让更多的人知道 Jdk&#xff1a;11 Springboot版本&#xff1a;2.6.6 Dubbo版本&#xff1a;0.2.0&#xf…

dubbo最全的使用教程

dubbo是阿里一款高性能&#xff0c;轻量级的rpc框架&#xff0c;有两大核心功能&#xff1a;远程服务调用和服务治理。本文主要介绍dubbo的运用。 一&#xff0c;安装注册中心zookeeper 1&#xff0c;为什么需要注册中心&#xff0c;不要能不能远程服务调用 答&#xff1a;可以…

VS2017安装教程(详细版)

1.首先下载好安装包 百度网盘下载链接 链接&#xff1a;https://pan.baidu.com/s/1HW8hrLMazRsBkPvkDHkD1Q?pwdz4jg 提取码&#xff1a;z4jg 2.下载到桌面以管理员身份运行 点击继续 3.进入后更改安装位置&#xff0c;选择安装路径&#xff0c;千万不要安装到C盘 4.改完后…

vs2017秘钥

vs2017 企业版秘钥&#xff1a;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版秘钥&#xff1a;KBJFW-NXHK6-W4WJM-CRMQB-G3CDH 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章…

自定义 Tabhost 样式

经过了一天的折腾, 在网上也找了不少源码&#xff0c; 但是效果都不是很好&#xff0c;非常长&#xff0c; 最后自己终于写出了一个代码不是很多的Tabhost。 先上图(背景是随便弄的, 所以不怎么样) 首先&#xff0c; 我们要先写一个主xml main.xml 每一个LinearLayout代表…

tabHost 使用方法

近日 学习TabHost的使用 再网上搜不少文章 觉得这篇写的挺好 &#xff01; 出处 &#xff1a;http://www.blogjava.net/freeman1984/archive/2010/10/29/302803.html 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; priv…

android Tabhost控件的使用

Tabhost用来实现如图的效果&#xff1a; 上图的首页、自选、警报是由Tabhost控件来实现的&#xff0c;Tabhost控件中的每个tab其实都是一个Activity&#xff0c;也就是说我创建一个Tabhost&#xff0c;在tabhost中添加tab页就可以实现。 实现方式&#xff1a;1、创建布局文件 …