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

网友投稿 795 2022-10-24

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

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

目录DozerSpringBoot整合Dozerjar依赖引入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-spring

5.5.1

net.sf.dozer

dozer

5.5.1

dozer配置xml引入

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

bean-mappings.xml

xsi:schemaLocation="http://dozer.sourceforge-

http://dozer.sourceforge-/schema/beanmapping.xsd">

xsi:schemaLocation="http://dozer.sourceforge-

http://dozer.sourceforge-/schema/beanmapping.xsd">

global-configuration.xml

xsi:schemaLocation="http://dozer.sourceforge-

http://dozer.sourceforge-/schema/beanmapping.xsd">

yyyy-MM-dd HH:mm:ss

true

false&http://lt;/trim-strings>

java.lang.Enum

java.lang.Integer

xsi:schemaLocation="http://dozer.sourceforge-

http://dozer.sourceforge-/schema/beanmapping.xsd">

yyyy-MM-dd HH:mm:ss

true

false&http://lt;/trim-strings>

java.lang.Enum

java.lang.Integer

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 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 {

@Autowired

protected 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());

return

public 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引入

@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);

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Route - 快速路由器和调度程序构建在FastRoute之上
下一篇:xsec-traffic为一款轻量级的恶意流量分析程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~