Orika的高级映射配置和自定义转换器
高级映射配置
空值映射
进行AB对象转换时,对于空值字段的处理,选择映射还是忽略根据场景的不同而不同。默认情况下orika 框架选择的策略是忽略。
ClassMap 级别
可以在ClassMap
级别设置是否映射空值,例如下面在field1
和fieldOne
转换前将其设置为“映射空值”,转换后再设置为“忽略空值”
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class) // 设置为映射空值 .mapNulls(true).mapNullsInReverse(true) .field("field1", "fieldOne") // 设置为忽略空值 .mapNulls(false).mapNullsInReverse(false) .field("field2", "fieldTwo") .byDefault() .register(); 复制代码
FieldMap 级别
在FieldMap
级别设置空值则使用fieldMap
方法,指定某些字段的转换是“赋值”还是“忽略”。
mapperFactory.classMap(BasicPerson.class, BasicPersonDto.class) .mapNulls(false).mapNullsInReverse(false) .fieldMap("field1", "fieldOne").mapNulls(true).mapNullsInReverse(true).add() .field("field2", "fieldTwo") .byDefault() .register(); 复制代码
自定义单个 ClassMaps
使用 orika 框架提供的customize()
方法可以自定义由AB对象的转换方法
mapperFactory.classMap(Source.class, Destination.class) .customize( new CustomMapper<Source, Destination>() { @Override public void mapAtoB(Source source, Destination dest, MappingContext context) { super.mapAtoB(source, dest, context); } @Override public void mapBtoA(Destination approvalEntry, Source source, MappingContext context) { super.mapBtoA(dest, source, context); } }).register(); 复制代码
自定义转换器
Orika 框架支持注册自定义的转换器,支持在全局注册和字段级别的注册,例如我们定义一个如下的转换器,用于从DateTime
转换到Date
public class JodaTimeToDateConverter extends CustomConverter<DateTime, Date> { @Override public Date convert(DateTime source, Type<? extends Date> destinationType, MappingContext mappingContext) { return source.toDate(); } } 复制代码
定义完转换器后支持在全局注册,如下面代码所示,应用到所有DateTime
类型字段到Date
类型字段应用转换器。
mapperFactory.getConverterFactory().registerConverter(new JodaTimeToDateConverter()); 复制代码
也可以在字段级别注册,如下面代码所示,仅对createTime
字段应用转换器。
mapperFactory.getConverterFactory().registerConverter("createTime", new JodaTimeToDateConverter()); 复制代码
另外上述仅支持了DateTime
转换到Date
,可以继承BidirectionalConverter
类以完成两个类型的双向转换,如下面代码所示
public class JodaTimeToDateConverter extends BidirectionalConverter<DateTime, Date> { @Override public Date convertTo(DateTime source, Type<Date> destinationType, MappingContext mappingContext) { return source.toDate(); } @Override public DateTime convertFrom(Date source, Type<DateTime> destinationType, MappingContext mappingContext) { return new DateTime(source); } }
作者:小岛秀夫
链接:https://juejin.cn/post/7032886752528302087