我正在使用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的解决方案似乎更合适。
有谁知道这个具体例子中的问题在哪里?
干杯, 罗伯特
答案 0 :(得分:2)
观察到的行为是故意的。
可以创建一个处理对象创建的ObjectFactory,而不是使用处理空值的自定义转换器。在这里,我们可以设置默认值,并在需要时覆盖它们(即,如果映射了非空对象),则自定义转换器中。 请注意,我们必须设置
.mapNulls(false)
让这个工作。
感谢Orika的Elaatifi提供此解决方案!