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