Springboot整合Dozer实现深度复制的方法
短信预约 -IT技能 免费直播动态提醒
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加入以下依赖
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-spring</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
dozer配置xml引入
resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml
bean-mappings.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
</mappings>
global-configuration.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<date-format>yyyy-MM-dd HH:mm:ss</date-format>
<wildcard>true</wildcard>
<trim-strings>false</trim-strings>
<!-- 自定义的枚举与Integer转换器, 下节介绍 -->
<custom-converters>
<converter type="com.dongao.beacon.ds.web.admin.tookit.EnumIntegerBiDirectionalDozerConverter">
<class-a>java.lang.Enum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
</mappings>
Dozer的JavaConfig
用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
新建DozerMapperConfig.java
public class DozerMapperConfig {
@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer
<T, S> T convert(S s, Class<T> clz);
/**
* @Description
: 深度复制结果集(
ResultSet
为自定义的分页结果集)
*
@param s 数据对象
<T, S>
ResultSet
<T> convert(
<S> s, Class<T> clz);
/**
* @Description: list深度复制
* @Time 2018年5月9日 下午3:54:08
<T, S> List<T> convert(List<S> s, Class<T> clz);
* @Description: set深度复制
* @Time 2018年5月9日 下午3:54:39
<T, S> Set<T> convert(Set<S> s, Class<T> clz);
* @Description: 数组深度复制
* @Time 2018年5月9日 下午3:54:57
<T, S> T[] convert(S[] s, Class<T> clz);
}
IGenerator
实现
@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
public <T, S> T convert(S s, Class<T> clz) {
if (s == null) {
return null;
}
return this.dozerMapper.map(s, clz);
}
public
<T, S>
ResultSet
<T>
convert
(
<S> s, Class<T> clz) {
if (s == null) {
return null
;
}
resultSet
=
new
<T>();
for
(S vs : s.getResult()) {
.getResult().add(
this
.dozerMapper.map(vs, clz));
.setTotal(s.getTotal());
.setExt(s.getExt());
.setModifyTime(s.getModifyTime());
return
public <T, S> List<T> convert(List<S> s, Class<T> clz) {
List<T> list = new ArrayList<T>();
for (S vs : s) {
list.add(this.dozerMapper.map(vs, clz));
return list;
public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
Set<T> set = new HashSet<T>();
set.add(this.dozerMapper.map(vs, clz));
return set;
public <T, S> T[] convert(S[] s, Class<T> 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);
到此这篇关于Springboot整合Dozer深度复制的文章就介绍到这了,更多相关Springboot整合Dozer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341