经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
通用权限系统-Dozer对象转换
来源:cnblogs  作者:JavaCoderPan  时间:2023/7/10 9:51:32  对本文有异议

Dozer对象转换

介绍

Dozer 是一个 Java Bean 到 Java Bean 的映射器,它可以递归地将数据从一个对象复制到另一个。通常情况下,这些Java Beans将是不同的复杂类型。

Dozer支持简单的属性映射,复杂的类型映射,双向映射,隐式-显式映射,以及递归映射。这包括映射集合属性,这些集合属性也需要在元素层面进行映射。

Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。 dozer是用来对两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的调用set和get方法了。dozer其实是对我们熟知的beanutils的封装。

dozer的maven坐标:

  1. <dependency>
  2. <groupId>com.github.dozermapper</groupId>
  3. <artifactId>dozer-core</artifactId>
  4. <version>6.5.0</version>
  5. </dependency>

为了简化使用方式,dozer还提供了starter,其maven坐标为:

  1. <dependency>
  2. <groupId>com.github.dozermapper</groupId>
  3. <artifactId>dozer-spring-boot-starter</artifactId>
  4. <version>6.5.0</version>
  5. </dependency>

Dozer入门案例

第一步:创建maven工程dozer_demo并配置pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.2.2.RELEASE</version>
  10. <relativePath/>
  11. </parent>
  12. <groupId>org.pp</groupId>
  13. <artifactId>dozer-demo</artifactId>
  14. <version>1.0-SNAPSHOT</version>
  15. <properties>
  16. <maven.compiler.source>8</maven.compiler.source>
  17. <maven.compiler.target>8</maven.compiler.target>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>com.github.dozermapper</groupId>
  23. <artifactId>dozer-spring-boot-starter</artifactId>
  24. <version>6.5.0</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>junit</groupId>
  28. <artifactId>junit</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-test</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. </dependency>
  38. </dependencies>
  39. </project>

第二步:创建UserDTO和UserEntity

  1. package org.pp.dto;
  2. import lombok.Data;
  3. /**
  4. * TODO
  5. *
  6. * @author ss_419
  7. * @version 1.0
  8. * @date 2023/7/9 17:29
  9. */
  10. @Data
  11. public class UserDTO {
  12. private String userId;
  13. private String userName;
  14. private int userAge;
  15. private String address;
  16. private String birthday;
  17. }
  1. package org.pp.entity;
  2. import lombok.Data;
  3. import java.util.Date;
  4. /**
  5. * @author ss_419
  6. */
  7. @Data
  8. public class UserEntity {
  9. private String id;
  10. private String name;
  11. private int age;
  12. private String address;
  13. private Date birthday;
  14. }

第三步:在resources/dozer/目录下创建dozer的全局配置文件global.dozer.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://dozermapper.github.io/schema/bean-mapping"
  4. xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
  5. http://dozermapper.github.io/schema/bean-mapping.xsd">
  6. <!--
  7. 全局配置:
  8. <date-format>表示日期格式
  9. -->
  10. <configuration>
  11. <date-format>yyyy-MM-dd</date-format>
  12. </configuration>
  13. </mappings>

注:全局配置文件名称可以任意

第四步:在resources/dozer/目录下创建dozer的映射文件biz.dozer.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://dozermapper.github.io/schema/bean-mapping"
  4. xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
  5. http://dozermapper.github.io/schema/bean-mapping.xsd">
  6. <!--描述两个类中属性的对应关系,对于两个类中同名的属性可以不映射-->
  7. <mapping date-format="yyyy-MM-dd">
  8. <class-a>org.pp.entity.UserEntity</class-a>
  9. <class-b>org.pp.dto.UserDTO</class-b>
  10. <field>
  11. <a>id</a>
  12. <b>userId</b>
  13. </field>
  14. <field>
  15. <a>name</a>
  16. <b>userName</b>
  17. </field>
  18. <field>
  19. <a>age</a>
  20. <b>userAge</b>
  21. </field>
  22. </mapping>
  23. <!--
  24. 可以使用map-id指定映射的标识,在程序中通过此标识来确定使用当前这个映射关系
  25. -->
  26. <mapping date-format="yyyy-MM-dd" map-id="user">
  27. <class-a>org.pp.entity.UserEntity</class-a>
  28. <class-b>org.pp.dto.UserDTO</class-b>
  29. <field>
  30. <a>id</a>
  31. <b>userId</b>
  32. </field>
  33. <field>
  34. <a>name</a>
  35. <b>userName</b>
  36. </field>
  37. <field>
  38. <a>age</a>
  39. <b>userAge</b>
  40. </field>
  41. </mapping>
  42. </mappings>

注:映射文件名称可以任意

第五步:编写application.yml文件

  1. dozer:
  2. mappingFiles:
  3. - classpath:dozer/global.dozer.xml
  4. - classpath:dozer/biz.dozer.xml

image

第六步:编写启动类DozerApp

  1. package org.pp;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @author ss_419
  6. */
  7. @SpringBootApplication
  8. public class DozerApp {
  9. public static void main(String[] args) {
  10. SpringApplication.run(DozerApp.class,args);
  11. }
  12. }

第七步:编写单元测试DozerTest

  1. package org.pp.test;
  2. import com.github.dozermapper.core.Mapper;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.pp.DozerApp;
  6. import org.pp.dto.UserDTO;
  7. import org.pp.entity.UserEntity;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.test.context.junit4.SpringRunner;
  11. /**
  12. * TODO
  13. *
  14. * @author ss_419
  15. * @version 1.0
  16. * @date 2023/7/9 17:59
  17. */
  18. @RunWith(SpringRunner.class)
  19. @SpringBootTest(classes = DozerApp.class)
  20. public class DozerTest {
  21. @Autowired
  22. private Mapper mapper;// 使用Mapper对象可以完成两个对象之间属性复制
  23. /**
  24. * 原本UserEntity不存在
  25. */
  26. @Test
  27. public void testDozer1(){
  28. UserDTO userDTO = new UserDTO();
  29. userDTO.setUserId("100");
  30. userDTO.setUserName("panpan");
  31. userDTO.setUserAge(24);
  32. userDTO.setAddress("nj");
  33. userDTO.setBirthday("1999-04-19");
  34. // 调用方法进行转换
  35. UserEntity user = mapper.map(userDTO, UserEntity.class);
  36. System.out.println("user = " + user);
  37. }
  38. /**
  39. * 原本UserEntity已经存在,对其进行覆盖参数值
  40. */
  41. @Test
  42. public void testDozer2(){
  43. UserDTO userDTO = new UserDTO();
  44. userDTO.setUserId("100");
  45. userDTO.setUserName("itcast");
  46. userDTO.setUserAge(20);
  47. userDTO.setAddress("bj");
  48. userDTO.setBirthday("2010-11-20");
  49. UserEntity userEntity = new UserEntity();
  50. userEntity.setId("2000");
  51. System.out.println("1====> userEntity = " + userEntity);
  52. mapper.map(userDTO,userEntity);
  53. System.out.println("2====> userEntity = " + userEntity);
  54. }
  55. @Test
  56. public void testDozer3(){
  57. UserDTO userDTO = new UserDTO();
  58. userDTO.setUserId("100");
  59. userDTO.setUserName("itcast");
  60. userDTO.setUserAge(20);
  61. userDTO.setAddress("bj");
  62. UserEntity user = new UserEntity();
  63. System.out.println(user);
  64. // 指定使用配置文件中的映射关系进行映射
  65. mapper.map(userDTO,user,"user");
  66. System.out.println(user);
  67. }
  68. }

pd-tools-dozer使用

在pd-tools-dozer模块中为了进一步简化操作,封装了一个工具类DozerUtils,其内部使用的就是Mapper对象进行的操作。并且按照Spring Boot starter的规范编写/resources/META-INF/spring.factories文件,内容如下:

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.itheima.pinda.dozer.DozerAutoConfiguration

在配置类DozerAutoConfiguration中完成DozerUtils对象的创建,这样其他的程序如果需要使用dozer进行对象转换,只需要引入这个模块的maven坐标并且提供对应的映射文件就可以在程序中直接注入DozerUtils对象进行操作了。

具体使用过程:

第一步:创建maven工程myDozerApp并配置pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.2.2.RELEASE</version>
  10. <relativePath/>
  11. </parent>
  12. <groupId>org.pp</groupId>
  13. <artifactId>myDozerDemo</artifactId>
  14. <version>1.0-SNAPSHOT</version>
  15. <properties>
  16. <maven.compiler.source>8</maven.compiler.source>
  17. <maven.compiler.target>8</maven.compiler.target>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. </properties>
  20. <dependencies>
  21. <!--引入我们自己定义的dozer基础模块-->
  22. <dependency>
  23. <groupId>com.itheima</groupId>
  24. <artifactId>pd-tools-dozer</artifactId>
  25. <version>1.0-SNAPSHOT</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-web</artifactId>
  34. </dependency>
  35. </dependencies>
  36. </project>

第二步:创建UserEntity和UserDTO

  1. package org.pp.entity;
  2. import lombok.Data;
  3. /**
  4. * @author ss_419
  5. */
  6. @Data
  7. public class UserEntity {
  8. private Integer id;
  9. private String name;
  10. private int age;
  11. private String addr;
  12. }
  1. package org.pp.dto;
  2. import lombok.Data;
  3. /**
  4. * @author ss_419
  5. */
  6. @Data
  7. public class UserDTO {
  8. private Integer userId;
  9. private String userName;
  10. private int userAge;
  11. private String address;
  12. }

第三步:创建UserController

  1. package org.pp.controller;
  2. import com.itheima.pinda.dozer.DozerUtils;
  3. import org.pp.dto.UserDTO;
  4. import org.pp.entity.UserEntity;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/user")
  11. public class UserController {
  12. @Autowired
  13. private DozerUtils dozerUtils; //在pd-tools-dozer中已经完成了自动配置,可以直接注入
  14. @GetMapping("/mapper")
  15. public UserEntity mapper(){
  16. UserDTO userDTO = new UserDTO();
  17. userDTO.setUserId(10);
  18. userDTO.setUserName("P_P");
  19. userDTO.setUserAge(20);
  20. userDTO.setAddress("njnj");
  21. System.out.println("userDTO = " + userDTO);
  22. UserEntity userEntity = dozerUtils.map(userDTO, UserEntity.class);
  23. System.out.println("userEntity = " + userEntity);
  24. return userEntity;
  25. }
  26. }

第四步:创建application.yml

  1. server:
  2. port: 8080

第五步:创建启动类

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class MyDozerApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(MyDozerApplication.class,args);
  7. }
  8. }

启动项目,访问地址:http://localhost:8080/user/mapper
image

注意:由于当前我们创建的UserEntity和UserDTO中的属性完全一致,所以并没有提供映射文件,如果这两个类中的属性存在不一致的情况,需要创建映射文件进行映射,并且还需要在application.yml中配置映射文件的位置,例如:

  1. dozer:
  2. mappingFiles:
  3. - classpath:dozer/biz.dozer.xml #指定dozer的映射文件位置

原文链接:https://www.cnblogs.com/atwood-pan/p/17539345.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号