DozerMapper是一个开源的Java库,用于对象映射,它可以将一个对象转换成另一个具有相同属性的类型的对象。在处理List时,DozerMapper可以方便地将一个List中的对象映射到另一个具有相同类型元素的List中。以下是如何使用DozerMa

摘要:背景 某项目某个功能点是接受前端传参,将其存入MongoDB。这个传参的核心数据是一个二维数组List<List<Object>>,可以放字符串、整型,
背景 某项目某个功能点是接受前端传参,将其存入MongoDB。这个传参的核心数据是一个二维数组List<List<Object>>,可以放字符串、整型,也可以放null。 在测试时发现,前端明明传的是整数,查出来却变成了字符串,比如1234变成了"1234"。经过排查发现,问题出在公司内部使用的一个Bean复制工具类,这个工具类简单封装了DozerMapper,主要功能是将一个Bean复制成一个新的Bean,并且允许这两个Bean的Class不同,从而完成各种类型转换,如:VO <-> Model、Model <-> DO、DO <-> DTO等。 为了快速修复问题从而不影响项目进度,我手写了前端传参和MongoDB的Entity类的转换逻辑,规避了这个问题。这个工具类在公司内部的代码中大量使用,问题的根因是什么?为了搞明白,我写了一个简单的demo,通过debug这部分代码来一探究竟。 关于DozerMapper DozerMapper有一些高级用法和对应的传参,但是日常中仅仅用到DozerBeanMapperBuilder.buildDefault()来处理。 DozerMapper的官方github,在mvnrepository上可以看到它的最新版本是7.0.0。 公司的工具类用的是6.5.2,也就是6.x的最后一个版本。经验证: 7.0.0和6.5.2都有这个bug 6.5.2可以运行在JDK8,7.0.0必须运行在JDK11及以上 本文基于JDK8+DozerMapper6.5.2分析。 问题简化和复现 将实际的传参简化如下。该类必须有无参数构造器,否则DozerMapper创建Bean时会报错。
阅读全文