1

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

4

2 回答 2

1

我自己找到了答案。

问题是,内置转换器是“BidirectionalConverter”,我使用了“CustomConverter”,因为我只对以一种方式更改映射感兴趣:XML --> Date。将其更改为双向解决了该问题。

于 2017-06-20T10:31:04.373 回答
0

我想你可能想把它作为一个问题报告给 Orika 人,这样他们就可以用他们的内置函数解决这个问题,或者以某种方式让它不会覆盖你注册的自定义转换器。

作为一种解决方法,我建议您在构建器上禁用内置的使用,并且仅在您注册了所有自定义转换器和覆盖后才注册内置转换器。这应该(至少从它们DefaultConverterFactory当前的工作方式来看)为您的自定义转换器提供抑制内置函数所需的优先级。

编码:

factory = new DefaultMapperFactory.Builder()
  .useBuiltinConverters(false)
  .build();
converterFactory = factory.getConverterFactory();

converterFactory.registerConverter(<... Your converter here ...>);

BuiltinConverters.register(converterFactory);
于 2017-06-20T10:27:57.327 回答