Orika的高级映射配置和自定义转换器

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

高级映射配置

空值映射

进行AB对象转换时,对于空值字段的处理,选择映射还是忽略根据场景的不同而不同。默认情况下orika 框架选择的策略是忽略

ClassMap 级别

可以在ClassMap级别设置是否映射空值,例如下面在field1fieldOne 转换前将其设置为“映射空值”,转换后再设置为“忽略空值”

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);
  }
}
复制代码

猜你喜欢

转载自juejin.im/post/7032886752528302087