Java对象转换工具-dozer
本文共 5,363 字,预计阅读时间 18 分钟
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目录下写多少配置,都会直接读取进来。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-07-09 Oracle基础