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

时间:2017-06-20 09:03:22

标签: java date orika xmlgregoriancalendar

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使用我的方式来映射这两种类型?

2 个答案:

答案 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);