是否可以将 Orika 的内置转换器 - XMLGregorianCalendar 覆盖为 java.util.Date?

Is it possible to override Orika's built in converter - XMLGregorianCalendar to java.util.Date?

Orika 有一组 "BuiltinConverters"

https://github.com/orika-mapper/orika/blob/master/core/src/main/java/ma/glasnost/orika/converter/builtin/BuiltinConverters.java

但是将 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 -->日期。将其更改为双向解决了问题。