SpringBoot Dozer

article/2025/9/9 15:04:01

文章目录

  • Dozer
      • springboot 配置 Dozer
      • 演示
      • Dozer工具接口和实现类
      • 全面测试
      • 项目实战演示

Dozer

Dozer是什么? Dozer是一个JavaBean映射工具库。

它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。

它支持三种映射方式:注解、API、XML。

springboot Dozer 可以作为项目实战

项目结构:
springboot目录及测试需要的文件位置.png

springboot 配置 Dozer

1.在pom.xml文件里添加Dozer依赖

<!-- dozer 对象间属性值赋值,不同属性名,借助map映射 -->
<dependency><groupId>net.sf.dozer</groupId><artifactId>dozer</artifactId><version>5.4.0</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions>
</dependency>

2.在config文件夹下添加:DozerConfig.java类

一定要在config下添加:springboot项目目录若没有config文件夹就新建一个

配置完成就可以测试使用mapper映射了!

package com.dist.config;import org.dozer.spring.DozerBeanMapperFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author yangmin* @date 2018/4/11* 返回一个dozer实例bean,目的是做对象间属性值的赋值操作*/
@Configuration
public class DozerConfig {@Beanpublic DozerBeanMapperFactoryBean mapper() {return new DozerBeanMapperFactoryBean();}
}

到此,项目就可以使用Dozer了,用Mapper mapper,可以在controller层也可以在server层。

@Autowired
private Mapper mapper;

演示

此处是springboot项目测试,

在entity文件夹目录下,创建实体类

创建UserDTO.java类

package com.dist.entity.dto;import lombok.Data;
import java.io.Serializable;//下载idea插件 lombok ,或网上百度@Data
//下载方式:https://blog.csdn.net/qq_37433657/article/details/83275051
@Data
public class UserDTO implements Serializable {private String userCode;private String loginName;private String loginPassword;private String deviceCode;private String systemCode;
}

创建:UserVO.java类

package com.dist.entity.dto;import lombok.Data;
import java.io.Serializable;@Data
public class UserVO implements Serializable {private String userCode;private String loginName;private String loginPassword;
}

在test文件夹下创建测试类:

DozerTest.java

package com.dist.test;import com.dist.SpringbootdemoApplication;
import com.dist.entity.dto.UserDTO;
import com.dist.entity.dto.UserVO;
import org.dozer.Mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringbootdemoApplication.class})
public class DozerTest{@Autowiredprivate Mapper mapper;/*** 单个对象的深度复制及类型转换,vo/domain , po* 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)*/@Testpublic void testMapper(){UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");UserVO userVO = mapper.map(userDTO, UserVO.class);System.out.println(userVO);}
输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)

映射成功,实现了类的深度复制;并且,过滤掉了前端不需要的数据;

Dozer工具接口和实现类

IGenerator.java接口:封装了Mapper工具接口:实现了list、set,数组,对象等深度复制!

package com.dist.utils;import java.util.List;
import java.util.Set;/*** @author zhengja@dist.com.cn* @data 2019/5/30 15:19*/
public interface IGenerator {/*** @Description: 单个对象的深度复制及类型转换,vo/domain , po* @param s 数据对象* @param clz 复制目标类型* @return* @author banjuer@outlook.com* @Time 2018年5月9日 下午3:53:24*/<T, S> T convert(S s, Class<T> clz);/*** @Description: list深度复制* @param s 数据对象* @param clz 复制目标类型* @return* @author banjuer@outlook.com* @Time 2018年5月9日 下午3:54:08*/<T, S> List<T> convert(List<S> s, Class<T> clz);/*** @Description: set深度复制* @param s 数据对象* @param clz 复制目标类型* @return* @author banjuer@outlook.com* @Time 2018年5月9日 下午3:54:39*/<T, S> Set<T> convert(Set<S> s, Class<T> clz);/*** @Description: 数组深度复制* @param s 数据对象* @param clz 复制目标类型* @return* @author banjuer@outlook.com* @Time 2018年5月9日 下午3:54:57*/<T, S> T[] convert(S[] s, Class<T> clz);}

IGenerator的实现类:EJBGenerator.java

package com.dist.utils;import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;import java.lang.reflect.Array;
import java.util.*;/*** @author zhengja@dist.com.cn* @data 2019/5/30 15:21*/
@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {@Autowiredprotected Mapper mapper;/*** @Description: 单个对象的深度复制及类型转换,vo/domain , po* @param s 数据对象* @param clz 复制目标类型* @param <T>* @param <S>* @return*/@Overridepublic <T, S> T convert(S s, Class<T> clz) {if (s == null) {return null;}return this.mapper.map(s, clz);}/***@Description: list深度复制* @param s 数据对象* @param clz 复制目标类型* @param <T>* @param <S>* @return*/@Overridepublic <T, S> List<T> convert(List<S> s, Class<T> clz) {if (s == null) {return null;}List<T> list = new ArrayList<T>();for (S vs : s) {list.add(this.mapper.map(vs, clz));}return list;}/*** @Description: Set深度复制* @param s 数据对象* @param clz 复制目标类型* @param <T>* @param <S>* @return*/@Overridepublic <T, S> Set<T> convert(Set<S> s, Class<T> clz) {if (s == null) {return null;}Set<T> set = new HashSet<T>();for (S vs : s) {set.add(this.mapper.map(vs, clz));}return set;}/*** @Description: 数组深度复制* @param s 数据对象* @param clz 复制目标类型* @param <T>* @param <S>* @return*/@Overridepublic <T, S> T[] convert(S[] s, Class<T> clz) {if (s == null) {return null;}@SuppressWarnings("unchecked")T[] arr = (T[]) Array.newInstance(clz, s.length);for (int i = 0; i < s.length; i++) {arr[i] = this.mapper.map(s[i], clz);}return arr;}
}

全面测试

package com.dist.test;import com.dist.SpringbootdemoApplication;
import com.dist.entity.dto.UserDTO;
import com.dist.entity.dto.UserVO;
import com.dist.utils.IGenerator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** Dozer是什么?Dozer是一个JavaBean映射工具库。它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。它支持三种映射方式:注解、API、XML。它是开源的,遵从Apache 2.0 协议* @author zhengja@dist.com.cn* @data 2019/5/30 14:36*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringbootdemoApplication.class})
public class DozerTest{/*@Autowiredprivate Mapper mapper;*//*** 封装了Mapper工具接口:实现了list、set,数组,对象等深度复制!*/@AutowiredIGenerator iGenerator;/*** 单个对象的深度复制及类型转换,vo/domain , po* 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)*//*@Testpublic void testMapper(){UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");UserVO userVO = mapper.map(userDTO, UserVO.class);System.out.println(userVO);}*//***单个对象的深度复制及类型转换,vo/domain , po* 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)*/@Testpublic void test(){UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");UserVO userVO = iGenerator.convert(userDTO, UserVO.class);//UserVO userVO = mapper.map(userDTO, UserVO.class);System.out.println(userVO);}/*** list深度复制*/@Testpublic void test1(){List<UserDTO> dtoList = new ArrayList<>();UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");dtoList.add(userDTO);List<UserVO> userVOS = iGenerator.convert(dtoList, UserVO.class);System.out.println(userVOS);}/****set深度复制*/@Testpublic void test2(){Set<UserDTO> dtoSet = new HashSet<>();UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");dtoSet.add(userDTO);Set<UserVO> userVOS = iGenerator.convert(dtoSet, UserVO.class);System.out.println(userVOS);}/*** 数组深度复制*/@Testpublic void test13(){UserDTO[] dtos = new UserDTO[3];UserDTO userDTO =new UserDTO();userDTO.setUserCode("123");dtos[0] = userDTO;dtos[1] = userDTO;dtos[2] = userDTO;UserVO[] userVOS = iGenerator.convert(dtos, UserVO.class);for (int i=0; i<userVOS.length;i++){System.out.println(userVOS[i]);}}
}

到此完成所有的测试!

<h2>测试结果:已经在测试的上面标注</h2>

项目实战演示

@RestController
@RequestMapping(value = "rest/admin/v1")
@Api(tags = {"OMS-UserController"}, description = "用户模块")
public class UserController extends BaseController {@ReferenceIUserService vUserService;@AutowiredMapper mapper;@ApiOperation(value = "获取用户", httpMethod = "GET")@GetMapping(value = "v1/get/user")public ResponseData getUser() {// 获取用户信息VUserinfo userInfo = vUserService.getUserInfo();//映射-过滤,只返回给前端需要的数据字段/数据格式UserDTO userDTO = mapper.map(userInfo, UserDTO.class);return ResponseUtil.success(userDTO);}
************************本片文章阅读结束************************作者:宇宙小神特别萌
个人博客:www.zhengjiaao.cn
Gitee 仓库:https://gitee.com/zhengjiaao
Github 仓库:https://github.com/zhengjiaao?tab=repositories
描述:喜欢文章的点赞收藏一下,关注不迷路,避免以后找不到哦,大家遇到问题下方可评论************************本片文章阅读结束************************

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

相关文章

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、创建布局文件 …

TabHost详解0

一、TabHost是一个选项卡容器&#xff0c;通过标签页将多个Activity整合到一起。 TabHost的三要素为&#xff1a;TabWidget、FrameLayout、List<TabSpec>。 其主要的使用方式有两种&#xff1a; 1.继承TabActivity&#xff0c;结合对应的xml配置文件导入tab选项内容体 …

TabHost

TabHost的实现有两种方式&#xff0c;第一种继承TabActivity&#xff0c;从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。 mainActivity.xml private TabHost myTabHost;Overridepublic void onCreate(Bundle savedInstanceState) {su…

Android初级控件TabHost

TabHost我们都知道是用来实现导航栏布局来切换页面的&#xff0c;这个也是元老级的控件了&#xff0c;现在逐渐被TabLayout,BottomNavigationBar,使用RadioButton自定义。。。等等给取代了。TabHost有个好处就是它添加的是Activity而不像上面那些全部使用Fragment来显示内容。 …

Android中TabHost嵌套TabHost

在嵌套TabHost时&#xff0c;先后遇到了以下情况&#xff1a; 问题1&#xff1a;内部TabHos无显示&#xff0c;只显示了其中的一个Activity&#xff1b; 解决&#xff1a;按下文比对主子TabHos的布局文件和java文件并修改&#xff1b; 问题2&#xff1a;如上所做后&#xff…