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 提供此解决方案!
我正在使用 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 提供此解决方案!