Java对象转换工具-dozer
1.概述
即在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。Dozer把对象中名称相同的属性进行复制,对于名称不相同或类型不一样,则可以在xml中进行定义。
其最大的优势在于对象中不同的名称之前只要配置了映射,就可以进行复制,减少大量使用get和set方法。而BeanUtils.copyProperties只能复制对象中名称且类型相同的属性。
2.实战演练
2.1环境准备
新建一个SpringBoot的项目,导入需要的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
2.2引入dozer
1)导入依赖
<dependency>
<groupId>com.github.dozermapper</groupId>
<artifactId>dozer-spring-boot-starter</artifactId>
<version>6.5.2</version>
</dependency>
2)创建对象UserDto,作为源对象
@Data
public class UserDto { private Integer userId; private String userName; private String address; private Integer age; private String birthday;
}
3)创建对象UserEntity,作为目标对象
@Data
public class UserEntity { private Integer id; private String name; private String addr; private Integer age; private Date birthday;
}
4)创建dozer全局的配置文件
在资源目录下新建dozer目录,新建文件dozer-config.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-mapping
http://dozermapper.github.io/schema/bean-mapping.xsd"> <!--全局配置-->
<configuration>
<date-format>yyyy-MM-dd</date-format>
</configuration> <!--配置对象中属性的对应关系,相同的属性无需映射-->
<mapping date-format="yyyy-MM-dd">
<class-a>com.zys.example.entity.UserEntity</class-a>
<class-b>com.zys.example.entity.UserDto</class-b>
<field>
<a>id</a>
<b>userId</b>
</field>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>addr</a>
<b>address</b>
</field>
</mapping>
</mappings>
5)配置xml文件的位置。在yml中配置如下:
dozer:
mapping-files: classpath:dozer/dozer-config.xml
6)新建接口UserController。由于需要Spring管理,直接使用controller进行测试:
package com.zys.example.controller; import com.github.dozermapper.core.Mapper;
import com.zys.example.entity.UserDto;
import com.zys.example.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/user")
public class UserController1 { @Autowired
private Mapper mapper; @GetMapping("/send")
public UserEntity sendMsg(Integer id, String msg) {
UserDto userDto = new UserDto();
userDto.setUserId(123);
userDto.setUserName("admin");
userDto.setAddress("武汉");
userDto.setAge(20);
userDto.setBirthday("2001-12-15");
UserEntity user = mapper.map(userDto, UserEntity.class);
return user;
}
}
7)测试。启动项目,输入http://localhost:8080/user/send,即可看到返回的值,说明这两个对象转换成功。
8)功能优化。
可以发现,如果有多个类进行映射,那么dozer-config.xml文件内容会很多,当然也可分文件映射。在dozer目录下新建user.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-mapping
http://dozermapper.github.io/schema/bean-mapping.xsd"> <!--配置对象中属性的对应关系,相同的属性无需映射-->
<mapping date-format="yyyy-MM-dd">
<class-a>com.zys.example.entity.UserEntity</class-a>
<class-b>com.zys.example.entity.UserDto</class-b>
<field>
<a>id</a>
<b>userId</b>
</field>
<field>
<a>name</a>
<b>userName</b>
</field>
<field>
<a>addr</a>
<b>address</b>
</field>
</mapping>
</mappings>
在mapping上指定日期格式,那么会把对应的所有的string类型的日期转成date类型。如果在field的每个字段上指定(date类型字段上),则只对该字段有效,如
<a date-format="yyyy-MM-dd">addr</a>
上述是string转date,那么如果需要把date转成String,则需要在string字段上指定日期格式即可。
那么就需要把dozer-config.xml的mapping标签删除。修改yml配置文件的dozer配置为通配符:
dozer:
mapping-files: classpath:dozer/*.xml
注意,dozer默认不支持通配符配置,故需编写配置类进行配置
package com.zys.example.config; import com.github.dozermapper.spring.DozerBeanMapperFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource; import java.io.IOException; @Configuration
public class DozerConfig { @Bean
public DozerBeanMapperFactoryBean dozerMapper(@Value("${dozer.mapping-files}") Resource[] resources) throws IOException {
DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(resources);
return dozerBeanMapperFactoryBean;
}
}
如此配置,无论dozer目录下写多少配置,都会直接读取进来。
Java对象转换工具-dozer的更多相关文章
- jxcel - 好用的Excel与Java对象转换工具
更多精彩博文,欢迎访问我的个人博客 Jxcel简介 Jxcel是一个支持Java对象与Excel(目前仅xlsx.xls)互相转换的工具包. 项目地址:https://github.com/jptan ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- JAVA对象转换JSON
1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...
- 对象转换工具 MapStruct 介绍
前言 在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO.XXXVO.XXXBO 等基于数据库对象派生出来的对象 ...
- 我的Android进阶之旅------>Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换)
Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换) 有时候要做出如下所示的展示文件大小的效果时候,需要对文件大小进行转换,然后再进行相关的代码逻辑编写. 下面是一个Java ...
- xml与java对象转换 -- XStreamAlias
@XStreamAlias使用 一. 特点: 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有字段,不需要setter/getter方法 提供序列化接口 ...
- java对象转换
对象转换: 对象的分层涉及到各个层级之间的对象转换(Entity2DTO , DTO2VO, VO2DTO,DTO2Entity等),传统的采用set/get 方法硬编码实现写的代码比较多:或者采用B ...
- mapstruct解放Java对象转换
摘要 当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换.这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手 ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
随机推荐
- iPaaS丨企业应用及数据集成的重要性和挑战
在激烈的市场竞争中,企业服务总线和数据总线扮演着企业神经网络的角色,它们将不同的业务部门.系统以及数据紧密相连,保障信息流通无阻,实现资源的高效分配.这样的集成不仅提高了企业的运营效率,还增强了企业的 ...
- flink 1.11.2 学习笔记(1)-wordCount
一.pom依赖 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns=" ...
- GFOJ-1808 牛奶访客
题面 题目描述 Farmer John 计划建造 \(N\)(\(1 \leq N \leq 10^5\))个农场,用 \(N−1\) 条道路连接,构成一棵树(也就是说,所有农场之间都互相可以到达,并 ...
- 数据库的<> 比较运算
数据库的<> 比较运算的等于!= where name <> '张三' 会把NULL的值对应的记录排除掉,所以不包含null和NULL的记录:所以只有''和'李四'才符合条件, ...
- python 中 sys.argv 传参
在 Python 中,sys.argv 是一个列表,包含从命令行传递给脚本的参数.它的索引规则如下: sys.argv 的参数顺序 sys.argv[0] 总是脚本自身的名称(即被执行的 Python ...
- 领域驱动设计(DDD)在分布式系统中的架构实践
在分布式系统设计中,随着业务复杂度提升,传统 "面向技术" 的架构设计难以应对业务变化.领域驱动设计(Domain-Driven Design, DDD) 以业务领域为核心,通过建 ...
- AI 加持实时互动|ZegoAvatar 面部表情随动技术解析
01 AI"卷" 进实时互动 2021 年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对 "身份".&qu ...
- CAD插件『PDF转CAD格式』安装教程
在工程设计领域,常规流程是将完成的CAD图纸直接转换为PDF格式或输出为纸质蓝图进行分发.由于PDF文件具有跨平台兼容性强.防篡改等特性,在工程交付环节被广泛采用.但当需要对既有图纸进行二次修改时,P ...
- GitHub上创建仓库并clone到当前开发环境
点击头像选择your repositories->New进入如下界面: 选择自己需要的选项而后创建 clone到当前开发环境,在命令行输入:git clone 复制SSH的URL
- 从技术架构到场景落地:JetLinks 与 MyEMS 的差异化路径与价值解析
在数字化转型的浪潮中,物联网平台与垂直领域管理系统分别承担着 "全域连接" 与 "专业管控" 的核心角色.JetLinks 作为物联网 PaaS 层的代表性解决 ...