您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Springboot如何整合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帶來的是性能開銷.(這是不可能…)
某些特殊操作可以用切面控制特殊字段進行置空操作
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>
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>
用于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, 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; }
一般在公共父類中引入, 此處例子為前端公共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實現深度復制”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。