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.dozer dozer-spring5.5.1 net.sf.dozer dozer5.5.1
dozer配置xml引入
resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml
bean-mappings.xml
global-configuration.xml
yyyy-MM-dd HH:mm:ss true false java.lang.Enum java.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; publicT 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- SpringBoot中Dozer的使用小结
- springboot|SpringBoot系统笔记
- spring|springboot简单小项目练习之增删改查-exercisePro01
- Spring|SpringBoot2——SpringBoot入门、SpringBoot的自动配置、配置文件和开发小技巧
- SpringBoot(一)——自动装配原理
- SpringBoot|【SpringBoot 2】(六)配置文件 web开发相关
- spring|springboot集成mybatis(使用逆向工程)
- SpringBoot|【SpringBoot 2】(五)自动配置简析源码 开发中小技巧
- SpringBoot|SpringBoot(二)——自动装配原理
- SpringBoot利用限速器RateLimiter实现单机限流的示例代码