Springboot整合Dozer實(shí)現(xiàn)深度復(fù)制的方法
Dozer
Dozer是一種Java Bean到Java Bean的映射器,遞歸地將數(shù)據(jù)從一個(gè)對(duì)象復(fù)制到另一個(gè)對(duì)象,它是一個(gè)強(qiáng)大的,通用的,靈活的,可重用的和可配置的開(kāi)源映射框架。
常用于:
- 代碼層與層之間javabean轉(zhuǎn)換, 如dao層PO轉(zhuǎn)前端VO
- 分布式中, DAO層PO轉(zhuǎn)DTO, DO 以及web層DTO轉(zhuǎn)VO
注意的場(chǎng)景:
- 由于bean之間的深度復(fù)制, 在進(jìn)行一些類(lèi)似更新, 插入操作時(shí)尤其要注意最終接收到PO的一些關(guān)鍵字段如ID是否是真正需要的. 場(chǎng)景: 傳入的DTO A為查出的DTO B復(fù)制后的, 這時(shí)候A里會(huì)有B的ID, 在插入A的時(shí)候很有可能造成主鍵沖突.
建議:
- 不用Dozer最好, Dozer帶來(lái)的是性能開(kāi)銷(xiāo).(這是不可能…)
- 某些特殊操作可以用切面控制特殊字段進(jìn)行置空操作
SpringBoot整合Dozer
jar依賴(lài)引入
pom.xml加入以下依賴(lài)
<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轉(zhuǎn)換器, 下節(jié)介紹 -->
<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/*.xml") Resource[] resources) throws Exception {
final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(resources);
return dozerBeanMapperFactoryBean;
}
}格式化工廠(chǎng)
建議新建包專(zhuān)門(mén)放置Dozer工具
接口定義: 新建IGenerator.java接口
public interface IGenerator {
/**
* @Description: 單個(gè)對(duì)象的深度復(fù)制及類(lèi)型轉(zhuǎn)換,vo/domain , po
* @param s 數(shù)據(jù)對(duì)象
* @param clz 復(fù)制目標(biāo)類(lèi)型
* @return
* @author banjuer@outlook.com
* @Time 2018年5月9日 下午3:53:24
*/
<T, S> T convert(S s, Class<T> clz);
/**
* @Description
: 深度復(fù)制結(jié)果集(
ResultSet
為自定義的分頁(yè)結(jié)果集)
*
@param s 數(shù)據(jù)對(duì)象
<T, S>
ResultSet
<T> convert(
<S> s, Class<T> clz);
/**
* @Description: list深度復(fù)制
* @Time 2018年5月9日 下午3:54:08
<T, S> List<T> convert(List<S> s, Class<T> clz);
* @Description: set深度復(fù)制
* @Time 2018年5月9日 下午3:54:39
<T, S> Set<T> convert(Set<S> s, Class<T> clz);
* @Description: 數(shù)組深度復(fù)制
* @Time 2018年5月9日 下午3:54:57
<T, S> T[] convert(S[] s, Class<T> clz);
}IGenerator實(shí)現(xiàn)
@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
一般在公共父類(lèi)中引入, 此處例子為前端公共Controller引入
@Controller
public class BaseController {
@Autowired
protected EJBGenerator ejbGenerator = new EJBGenerator();
protected final Logger logger = LoggerFactory.getLogger(getClass());
}// 個(gè)人信息變更記錄session SessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);
到此這篇關(guān)于Springboot整合Dozer深度復(fù)制的文章就介紹到這了,更多相關(guān)Springboot整合Dozer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?獲取Zookeeper節(jié)點(diǎn)下所有數(shù)據(jù)詳細(xì)步驟
本文介紹了如何使用Java獲取ZooKeeper節(jié)點(diǎn)下所有數(shù)據(jù),實(shí)際應(yīng)用示例中,我們演示了如何從ZooKeeper節(jié)點(diǎn)下獲取配置信息并輸出到控制臺(tái),ZooKeeper是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),適用于分布式系統(tǒng)中的數(shù)據(jù)同步、配置管理、命名服務(wù)等功能,感興趣的朋友一起看看吧2024-11-11
java定義通用返回結(jié)果類(lèi)ResultVO使用示例詳解
這篇文章主要為大家介紹了java定義通用返回結(jié)果類(lèi)ResultVO使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(lèi)(圖文詳細(xì)教程)
這篇文章主要介紹了Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(lèi)(圖文詳細(xì)教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
maven子模塊相互依賴(lài)打包時(shí)報(bào)錯(cuò)找不到類(lèi)的解決方案
本文主要介紹了maven子模塊相互依賴(lài)打包時(shí)報(bào)錯(cuò)找不到類(lèi)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
try catch finally的執(zhí)行順序深入分析
首先執(zhí)行try,如果有異常執(zhí)行catch,無(wú)論如何都會(huì)執(zhí)行finally,當(dāng)有return以后,函數(shù)就會(huì)把這個(gè)數(shù)據(jù)存儲(chǔ)在某個(gè)位置,然后告訴主函數(shù),我不執(zhí)行了,接下來(lái)你執(zhí)行吧,所以函數(shù)就會(huì)推出2013-09-09
Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程)
這篇文章主要介紹了Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
使用SkyWalking監(jiān)控Java服務(wù)的過(guò)程
這篇文章主要介紹了使用SkyWalking監(jiān)控Java服務(wù),介紹一個(gè)對(duì)源碼0入侵的Java服務(wù)監(jiān)控方式,SkyWalking Agent,只需要啟動(dòng)Java程序的時(shí)候加幾個(gè)參數(shù),就能對(duì)Java服務(wù)進(jìn)行可視化監(jiān)控,需要的朋友可以參考下2023-08-08
在mybatis中使用mapper進(jìn)行if條件判斷
這篇文章主要介紹了在mybatis中使用mapper進(jìn)行if條件判斷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02

