天天看點

使用dozer實作對象轉換

Dozer的github位址: https://github.com/DozerMapper/dozer Dozer的官方文檔: http://dozer.sourceforge.net/

什麼是Dozer

Dozer是一個JavaBean映射工具庫。

Dozer是Java Bean到Java Bean映射器,将資料從一個對象遞歸到另一個對象,它是一個開放源代碼映射架構,是強大的,通用的,靈活的,可重用的和可配置的。

Dozer支援簡單的屬性映射,複雜類型映射,雙向映射,隐式顯式映射以及遞歸映射。 這包括在元素級别還需要映射的映射集合屬性。

Dozer不僅支援屬性名稱之間的映射,而且還可以在類型之間自動轉換。 大多數轉換方案都是開箱即用的,但Dozer還允許您通過XML或基于代碼的配置指定自定義轉換。

Dozer有三種映射配置方式:

注解方式

API方式

XML方式

在springboot中的使用

1.引入依賴

項目使用maven,添加以下依賴到你的pom.xml即可:

版本(Apr 22, 2014)目前maven倉庫中最新的版本

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>
           

如果要映射的兩個對象有完全相同的屬性名,那麼一切都很簡單。

隻需要直接使用Dozer的API即可:

Mapper mapper = new DozerBeanMapper();
DestinationObject destObject =  
    mapper.map(sourceObject, DestinationObject.class);
           

實際應用,項目需要傳回VO類的資料,但你在mapper中是使用PO類,傳回時需要轉換

Mapper announcementDozerMapper =new DozerBeanMapper();
    /**
     * @param announcementPo 原PO類的announcement類型
     * @return 傳回VO類的announcement類型
     * @description 将announcement的PO類轉化為VO類
     **/
    private AnnouncementVo doToVo(AnnouncementPo announcementPo){
        if(announcementPo == null) {
            return null;
        }
        AnnouncementVo vo = announcementDozerMapper.map(announcementPo, AnnouncementVo.class);
        return vo;
    }
           

假如是集合對象呢,實際上就是使用JAVA8的stream流

Mapper announcementDozerMapper =new DozerBeanMapper();
    /**
     * @param announcementPos 原PO類的announcement類型集合
     * @return 傳回VO類的announcement類型集合
     * @description 将announcement的PO類集合轉化為VO類集合
     **/
    private List<AnnouncementVo> doToVo(List<AnnouncementPo> announcementPos){
        if(announcementPos == null) {
            return null;
        }
        return announcementPos
                .stream()
                .map(announcement -> this.announcementDozerMapper.map(announcement, AnnouncementVo.class))
                .collect(Collectors.toList());
    }
           

注:官網着重建議:在現實應用中,最好不要每次映射對象時都建立一個Mapper執行個體來工作,這樣會産生不必要的開銷。如果你不使用IoC容器(如:spring)來管理你的項目,那麼,最好将Mapper定義為單例模式。

如何來定義為單例模式呢?

1.建立類的唯一執行個體,加static變為類的成員

public class DozerMapperConstant {
    public static final Mapper dozerMapper = new org.dozer.DozerBeanMapper();
}
           

2.擷取類的執行個體,通過

類名.成員

擷取執行個體

Mapper announcementDozerMapper =  DozerMapperConstant.dozerMapper;
           

參考文章:

http://www.alliedjeep.com/146242.htm