Orika:CustomConverter没有调用null值

时间:2016-05-31 13:38:31

标签: java orika

我正在使用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的解决方案似乎更合适。

有谁知道这个具体例子中的问题在哪里?

干杯, 罗伯特

1 个答案:

答案 0 :(得分:2)

观察到的行为是故意的。

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

.mapNulls(false)

让这个工作。

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