是否可以将 Orika 的内置转换器 - XMLGregorianCalendar 覆盖为 java.util.Date?
Is it possible to override Orika's built in converter - XMLGregorianCalendar to java.util.Date?
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 使用我的方式来映射这两种类型?
我想你可能想将它作为一个问题报告给 Orika 的人,这样他们就可以用他们的内置解决这个问题,或者以某种方式解决这个问题,这样他们的内置就不会覆盖你注册的自定义转换器。
作为解决方法,我建议您禁用构建器上的内置转换器,并且仅在注册所有自定义转换器和覆盖后才注册内置转换器。这应该(至少根据他们的 DefaultConverterFactory
当前的工作方式来判断)为您的自定义转换器提供抑制内置所需的优先级。
代码:
factory = new DefaultMapperFactory.Builder()
.useBuiltinConverters(false)
.build();
converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(<... Your converter here ...>);
BuiltinConverters.register(converterFactory);
我自己找到了答案。
问题是,内置转换器是 "BidirectionalConverter",我使用 "CustomConverter",因为我只对以一种方式更改映射感兴趣:XML -->日期。将其更改为双向解决了问题。
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 使用我的方式来映射这两种类型?
我想你可能想将它作为一个问题报告给 Orika 的人,这样他们就可以用他们的内置解决这个问题,或者以某种方式解决这个问题,这样他们的内置就不会覆盖你注册的自定义转换器。
作为解决方法,我建议您禁用构建器上的内置转换器,并且仅在注册所有自定义转换器和覆盖后才注册内置转换器。这应该(至少根据他们的 DefaultConverterFactory
当前的工作方式来判断)为您的自定义转换器提供抑制内置所需的优先级。
代码:
factory = new DefaultMapperFactory.Builder()
.useBuiltinConverters(false)
.build();
converterFactory = factory.getConverterFactory();
converterFactory.registerConverter(<... Your converter here ...>);
BuiltinConverters.register(converterFactory);
我自己找到了答案。
问题是,内置转换器是 "BidirectionalConverter",我使用 "CustomConverter",因为我只对以一种方式更改映射感兴趣:XML -->日期。将其更改为双向解决了问题。