使用 BoundedMapperFacade 的 Orika 映射 类 包含其他对象

Orika Mapping using BoundedMapperFacade for classes containing other objects

我有 class 的形式 -

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

    // public getters and setters
}

我必须将上面的 class 映射到下面的内容

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 performance tuning指南所说

Use BoundMapperFacade to avoid repeated lookup of mapping strategy

所以我正在寻找像下面这样使用 BoundedMapperFacade 的东西以获得更好的性能

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

我不知道如何在上面的代码片段中为 MtuInterfaceMap 添加映射器。

任何人都可以提出建议吗?

BoundMapperFacade 将延迟解析来自映射器工厂的映射策略,并在首次调用 map() 方法时将其缓存。所以所有需要的映射定义都应该在那时注册到映射器工厂。

根据需要,有 3 种解决方案可用:

  1. 如果MtuInterfaceMapMtuInterfaceMapUIclass有相同的字段集,则不需要为它们声明classMap。 Orika 默认会复制列表元素,按名称映射字段;
  2. 如果映射足够简单(例如在不同名称的字段之间复制值),则可以声明classMap。父 class 的映射将在解析映射策略时自动使用它;
  3. 如果需要自定义映射,可以编写自定义转换器并将其注册到MapperFactory。在这种情况下,父 class 的 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);