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

时间:2018-02-09 12:58:23

标签: java orika

我有表格的类 -

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

  

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

所以我正在寻找使用下面的BoundedMapperFacade来获得更好性能的内容

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

我无法弄清楚如何在上面的代码段中添加MtuInterfaceMap的映射器。

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

1 个答案:

答案 0 :(得分:0)

BoundMapperFacade会懒惰地从映射器工厂解析映射策略,并在第一次调用map()方法时将其缓存。因此,当时所有必需的映射定义都应该在映射器工厂中注册。

根据需要,提供3种解决方案:

  1. 如果MtuInterfaceMapMtuInterfaceMapUI类具有相同的字段集,则无需为它们声明classMap。 Orika将默认复制列表元素,按名称映射字段;
  2. 如果映射足够简单(例如,在具有不同名称的字段之间复制值),则可以声明classMap。在解析映射策略时,父类的映射将自动使用它;
  3. 如果需要自定义映射,可以编写自定义转换器并将其注册到MapperFactory。在这种情况下,父类的classMap定义需要提示使用此转换器,并使用fieldMap().converter()语法。定制转换器可以通过扩展例如BidirectionalConverter<List<MtuInterfaceMap>, List<MtuInterfaceMapUI>>
  4. 示例代码可以写成如下:

    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);