Springboot整合Dozer实现深度复制的方法

 更新时间:2022年03月06日 12:01:54   作者:banjuer  
Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架,本文给大家介绍Springboot整合Dozer的相关知识,感兴趣的朋友跟随小编一起看看吧

Dozer

Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架。

常用于:

  • 代码层与层之间javabean转换, 如dao层PO转前端VO
  • 分布式中, DAO层PO转DTO, DO 以及web层DTO转VO

注意的场景:

  • 由于bean之间的深度复制, 在进行一些类似更新, 插入操作时尤其要注意最终接收到PO的一些关键字段如ID是否是真正需要的. 场景: 传入的DTO A为查出的DTO B复制后的, 这时候A里会有B的ID, 在插入A的时候很有可能造成主键冲突.

建议:

  • 不用Dozer最好, Dozer带来的是性能开销.(这是不可能…)
  • 某些特殊操作可以用切面控制特殊字段进行置空操作

SpringBoot整合Dozer

jar依赖引入

pom.xml加入以下依赖

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer-spring</artifactId>
    <version>5.5.1</version>
</dependency>
<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>

dozer配置xml引入

resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml

bean-mappings.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
</mappings>

global-configuration.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <configuration>
        <date-format>yyyy-MM-dd HH:mm:ss</date-format>      
        <wildcard>true</wildcard>
        <trim-strings>false</trim-strings>
        <!-- 自定义的枚举与Integer转换器, 下节介绍 -->
        <custom-converters>
            <converter type="com.dongao.beacon.ds.web.admin.tookit.EnumIntegerBiDirectionalDozerConverter">
                <class-a>java.lang.Enum</class-a>
                <class-b>java.lang.Integer</class-b>
            </converter>
        </custom-converters>
    </configuration>
</mappings>

Dozer的JavaConfig

用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
新建DozerMapperConfig.java

public class DozerMapperConfig {

    @Bean
    public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/*.xml") Resource[] resources) throws Exception {
        final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
        dozerBeanMapperFactoryBean.setMappingFiles(resources);
        return dozerBeanMapperFactoryBean;
    }

}

格式化工厂

建议新建包专门放置Dozer工具

接口定义: 新建IGenerator.java接口

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
   
    : 深度复制结果集(
    
     ResultSet
    为自定义的分页结果集)
     *
    @param s 数据对象
  
     <T, S> 
    ResultSet
   <T> convert(
   <S> s, Class<T> clz);
  /** 
     * @Description: list深度复制
     * @Time 2018年5月9日 下午3:54:08
    <T, S> List<T> convert(List<S> s, Class<T> clz);
     * @Description: set深度复制
     * @Time 2018年5月9日 下午3:54:39
    <T, S> Set<T> convert(Set<S> s, Class<T> clz);
     * @Description: 数组深度复制
     * @Time 2018年5月9日 下午3:54:57
    <T, S> T[] convert(S[] s, Class<T> clz);
}

IGenerator实现

@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
    @Autowired
    protected Mapper dozerMapper;
    public <T, S> T convert(S s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        return this.dozerMapper.map(s, clz);
    }
     public
  
    <T, S> 
   
    ResultSet
   <T> 
  convert
   (
   <S> s, Class<T> clz) {
     
  if (s == null) {
     return null
   ;
     }
    resultSet
    = 
  new
   <T>();
  for
    (S vs : s.getResult()) {
   .getResult().add(
  this
   .dozerMapper.map(vs, clz));
   .setTotal(s.getTotal());
   .setExt(s.getExt());
   .setModifyTime(s.getModifyTime());
  return
    
  public <T, S> List<T> convert(List<S> s, Class<T> clz) {
        List<T> list = new ArrayList<T>();
        for (S vs : s) {
            list.add(this.dozerMapper.map(vs, clz));
        return list;
    public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
        Set<T> set = new HashSet<T>();
            set.add(this.dozerMapper.map(vs, clz));
        return set;
    public <T, S> T[] convert(S[] s, Class<T> clz) {
        @SuppressWarnings("unchecked")
        T[] arr = (T[]) Array.newInstance(clz, s.length);
        for (int i = 0; i < s.length; i++) {
            arr[i] = this.dozerMapper.map(s[i], clz);
        return arr;
}

使用Demo

一般在公共父类中引入, 此处例子为前端公共Controller引入

@Controller
public class BaseController  {
    @Autowired
    protected EJBGenerator ejbGenerator = new EJBGenerator();
    protected final Logger logger = LoggerFactory.getLogger(getClass());

}
// 个人信息变更记录session
SessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);

到此这篇关于Springboot整合Dozer深度复制的文章就介绍到这了,更多相关Springboot整合Dozer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 获取Zookeeper节点下所有数据详细步骤

    Java 获取Zookeeper节点下所有数据详细步骤

    本文介绍了如何使用Java获取ZooKeeper节点下所有数据,实际应用示例中,我们演示了如何从ZooKeeper节点下获取配置信息并输出到控制台,ZooKeeper是一个开源的分布式协调服务,适用于分布式系统中的数据同步、配置管理、命名服务等功能,感兴趣的朋友一起看看吧
    2024-11-11
  • 浅析Java中的 new 关键字

    浅析Java中的 new 关键字

    java中的new关键字是实例化对象,接下来本文通过一个案例给大家讲解Java中的 new 关键字,感兴趣的朋友可以参考下
    2016-08-08
  • java定义通用返回结果类ResultVO使用示例详解

    java定义通用返回结果类ResultVO使用示例详解

    这篇文章主要为大家介绍了java定义通用返回结果类ResultVO使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程)

    Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程)

    这篇文章主要介绍了Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • maven子模块相互依赖打包时报错找不到类的解决方案

    maven子模块相互依赖打包时报错找不到类的解决方案

    本文主要介绍了maven子模块相互依赖打包时报错找不到类的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • try catch finally的执行顺序深入分析

    try catch finally的执行顺序深入分析

    首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出
    2013-09-09
  • Maven在Windows中的配置以及IDE中的项目创建(图文教程)

    Maven在Windows中的配置以及IDE中的项目创建(图文教程)

    这篇文章主要介绍了Maven在Windows中的配置以及IDE中的项目创建(图文教程),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 使用SkyWalking监控Java服务的过程

    使用SkyWalking监控Java服务的过程

    这篇文章主要介绍了使用SkyWalking监控Java服务,介绍一个对源码0入侵的Java服务监控方式,SkyWalking Agent,只需要启动Java程序的时候加几个参数,就能对Java服务进行可视化监控,需要的朋友可以参考下
    2023-08-08
  • 在mybatis中使用mapper进行if条件判断

    在mybatis中使用mapper进行if条件判断

    这篇文章主要介绍了在mybatis中使用mapper进行if条件判断,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java实现自定义枚举值校验器的示例代码

    Java实现自定义枚举值校验器的示例代码

    这篇文章主要为大家详细介绍了Java实现自定义枚举值校验器的相关资料,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02

最新评论