微前端架构如何改变企业的开发模式与效率提升
795
2022-10-24
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加入以下依赖
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">
xsi:schemaLocation="http://dozer.sourceforge-
http://dozer.sourceforge-/schema/beanmapping.xsd">
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
*/
/**
* @Description
: 深度复制结果集(
ResultSet
为自定义的分页结果集)
*
@param s 数据对象
ResultSet
s, Class
/**
* @Description: list深度复制
* @Time 2018年5月9日 下午3:54:08
s, Class
* @Description: set深度复制
* @Time 2018年5月9日 下午3:54:39
s, Class
* @Description: 数组深度复制
* @Time 2018年5月9日 下午3:54:57
}
IGenerator实现
@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
public
if (s == null) {
return null;
}
return this.dozerMapper.map(s, clz);
}
public
ResultSet
convert
(
s, Class
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 s, Class
List
for (S vs : s) {
list.add(this.dozerMapper.map(vs, clz));
return list;
public s, Class
Set
set.add(this.dozerMapper.map(vs, clz));
return set;
public
@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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~