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

目录

  • Dozer
  • SpringBoot整合Dozer
    • jar依赖引入
    • dozer配置xml引入
    • Dozer的JavaConfig
    • 格式化工厂
  • 使用Demo

    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加入以下依赖
    net.sf.dozerdozer-spring5.5.1net.sf.dozerdozer5.5.1


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

    global-configuration.xml
    yyyy-MM-dd HH:mm:sstruefalsejava.lang.Enumjava.lang.Integer


    Dozer的JavaConfig
    用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
    新建DozerMapperConfig.java
    public class DozerMapperConfig {@Beanpublic 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 convert(S s, Class clz); /*** @Description: 深度复制结果集(ResultSet为自定义的分页结果集)*@param s 数据对象 ResultSet convert(s, Class clz); /** * @Description: list深度复制* @Time 2018年5月9日 下午3:54:08 List convert(List s, Class clz); * @Description: set深度复制* @Time 2018年5月9日 下午3:54:39 Set convert(Set s, Class clz); * @Description: 数组深度复制* @Time 2018年5月9日 下午3:54:57 T[] convert(S[] s, Class clz); }

    IGenerator实现
    @Component@Lazy(true)public class EJBGenerator implements IGenerator {@Autowiredprotected Mapper dozerMapper; public T convert(S s, Class clz) {if (s == null) {return null; }return this.dozerMapper.map(s, clz); }public ResultSet convert(s, Class clz) {if (s == null) {return null; }resultSet= new(); for(S vs : s.getResult()) {.getResult().add(this.dozerMapper.map(vs, clz)); .setTotal(s.getTotal()); .setExt(s.getExt()); .setModifyTime(s.getModifyTime()); returnpublic List convert(List s, Class clz) {List list = new ArrayList(); for (S vs : s) {list.add(this.dozerMapper.map(vs, clz)); return list; public Set convert(Set s, Class clz) {Set set = new HashSet(); set.add(this.dozerMapper.map(vs, clz)); return set; public T[] convert(S[] s, Class 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引入
    @Controllerpublic class BaseController{@Autowiredprotected EJBGenerator ejbGenerator = new EJBGenerator(); protected final Logger logger = LoggerFactory.getLogger(getClass()); }

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

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

      推荐阅读