簡體   English   中英

使用BoundedMapperFacade進行包含其他對象的類的Orika映射

[英]Orika Mapping using BoundedMapperFacade for classes containing other objects

我有以下形式的課程-

class EdgeMtuMismatchEvent {
    private final List<MtuInterfaceMap> list = new ArrayList<>();
    private int id;

    // public getters and setters
}

我必須將上面的類映射到下面的內容

class EdgeMtuMismatchEventUI {
    private final List<MtuInterfaceMapUI> list = new ArrayList<>();
    private int id;

    // public getters and setters
}

我知道我可以像下面這樣映射

    final DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();
    factory.classMap(MtuInterfaceMap.class, MtuInterfaceMapUI.class).byDefault().register();
    factory.classMap(EdgeMtuMismatchEvent.class, EdgeMtuMismatchEventUI.class).byDefault().register();
//factory.getMapperFacade().map()

正如Orika性能調整指南所說

使用BoundMapperFacade避免重復查找映射策略

所以我正在尋找使用BoundedMapperFacade東西,如下所示,以獲得更好的性能

BoundMapperFacade<EdgeMtuMismatchEvent, EdgeMtuMismatchEventUI> facade = factory.getMapperFacade(EdgeMtuMismatchEvent.class, EdgeMtuMismatchEventUI.class, false)

我無法弄清楚如何在上面的代碼片段中為MtuInterfaceMap添加映射器。

有人可以建議什么嗎?

BoundMapperFacade將懶惰地解決映射器工廠中的映射策略,並在第一次調用map()方法時對其進行緩存。 因此,所有必需的映射定義都應在那時向映射器工廠注冊。

根據需要,可以提供3種解決方案:

  1. 如果MtuInterfaceMapMtuInterfaceMapUI類具有相同的字段集,則無需為其聲明classMap Orika默認會復制列表元素,並按名稱映射字段。
  2. 如果映射足夠簡單(例如,在具有不同名稱的字段之間復制值), classMap可以聲明classMap 解決映射策略時,父類的映射將自動使用它。
  3. 如果需要自定義映射,則可以編寫一個自定義轉換器並將其注冊到MapperFactory 在這種情況下,父類的classMap定義需要提示以使用此轉換器,並且使用fieldMap().converter()語法。 可以通過擴展BidirectionalConverter<List<MtuInterfaceMap>, List<MtuInterfaceMapUI>>來編寫自定義轉換器。

示例代碼可以編寫如下:

final DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();

// (1) auto-mapping
// nothing here

// (2) if the scenario is simple enough
factory.classMap(MtuInterfaceMap.class, MtuInterfaceMapUI.class)
       .field("comment", "details")
       .byDefault()
       .register();

// (3) if converter is required
final String listConverterId = "listConverter";
factory.getConverterMap()
       .registerConverter(listConverterId , new MtuInterfaceMapListConverter());


// 
factory.classMap(EdgeMtuMismatchEvent.class, EdgeMtuMismatchEventUI.class)
       .fieldMap("list", "list").converter(listConverterId).add() //  for case (3) only - declare converter
       .byDefault()
       .register();

BoundMapperFacade<EdgeMtuMismatchEvent, EdgeMtuMismatchEventUI> facade =
    factory.getMapperFacade(EdgeMtuMismatchEvent.class, 
                            EdgeMtuMismatchEventUI.class, 
                            false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM