Orika:未在空值上调用 CustomConverter

Orika: CustomConverter not called on null values

我正在使用 Orika 1.4.6,我想使用 CustomConverter 来映射我的字段之一。当源字段为空时,转换器似乎没有被调用。这是我的代码:

class From {
    String source;
}

class To {
    String destination = "defaultValue";
}

public class Mapper extends ConfigurableMapper {

  private class MyConverter extends CustomConverter<String, String> {

    @Override
    public String convert(String source, Type<? extends String> destinationType) {
      if (null == source) {
        return "NULL!";
      }
      return "->" + source + "<-";
    }
  }

  @Override
  protected void configure(MapperFactory factory) {

    factory.getConverterFactory().registerConverter("converter", new MyConverter());

    factory.classMap(From.class, To.class)

        .fieldMap("source", "destination")
        .mapNulls(true)
        .converter("converter")
        .add()

    .register();
  }
}

如果我映射以下对象:

From from = new From(); //from.source == null

Mapper mapper = new Mapper();
To to = mapper.map(from, To.class);

System.out.println(to.destination);

我希望得到以下输出:

NULL!

但是我得到以下信息:

null

这表明根本没有调用转换器,只是复制了空值,因为

.mapNulls(true)

如果我现在设置

.mapNulls(false)

问题仍然存在,因为源字段中的空值被忽略,目标字段保持不变(在本例中为值 "defaultValue")。

例如,可以将 "customize" 方法与 CustomMapper 结合使用。但是,此解决方案在我的实际应用程序中要复杂得多,因此使用 CustomConverter 的解决方案似乎更合适。

有人知道这个具体例子的问题出在哪里吗?

干杯, 罗伯特

观察到的行为是故意的。

可以创建处理对象创建的 ObjectFactory,而不是使用处理空值的自定义转换器。在这里我们可以设置默认值并在自定义转换器中根据需要覆盖它们(即如果映射了非空对象)。 注意这里我们要设置

.mapNulls(false)

为了这个工作。

感谢 Orika 的 Elaatifi 提供此解决方案!