Orika有一套“BuiltinConverters”
但是将XMLGregorianCalendar映射到java.util.Date的那个对我来说不能正常工作。我发现了以令人满意的结果映射它的方法,但我找不到让Orika使用它而不是自己的内置转换器的方法。我尝试在MapperDefinition中注册转换器:
public class MapperDefinition {
private final MapperFactory factory;
private final ConverterFactory converterFactory;
public MapperDefinition() {
factory = new DefaultMapperFactory.Builder().build();
converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(new CustomConverter<XMLGregorianCalendar, Date>() {
@Override
public Date convert(XMLGregorianCalendar source, Type<? extends Date> destinationType) {
LocalDateTime ldt = LocalDateTime.of(source.getYear(), source.getMonth(),
source.getDay(), source.getHour(), source.getMinute(), source.getSecond());
return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
}
}
}
}
但调试显示Orika似乎忽略了我的自定义转换器,仍然使用自己的内置转换器。我也找不到有关在Orika用户指南中覆盖它的任何信息:
https://orika-mapper.github.io/orika-docs/converters.html
有谁知道是否有可能让Orika使用我的方式来映射这两种类型?
答案 0 :(得分:1)
我自己找到了答案。
问题是,内置转换器是“BidirectionalConverter”,我使用“CustomConverter”,因为我只对以某种方式更改映射感兴趣:XML - &gt;日期。将其改为双向解决了这个问题。
答案 1 :(得分:0)
我想你可能想把它作为一个问题报告给Orika家伙,所以他们可以用他们的内置来修复问题,或者以某种方式使它们内置不会覆盖你注册的自定义转换器。
作为一种解决方法,我建议您在构建器上禁用内置函数,并仅在注册所有自定义转换器和覆盖后注册内置转换器。这应该(至少根据他们DefaultConverterFactory
当前的工作方式判断)为您的自定义转换器提供抑制内置函数所需的优先级。
代码:
factory = new DefaultMapperFactory.Builder()
.useBuiltinConverters(false)
.build();
converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(<... Your converter here ...>);
BuiltinConverters.register(converterFactory);