【问题标题】:Is it possible to override Orika's built in converter - XMLGregorianCalendar to java.util.Date?是否可以覆盖 Orika 的内置转换器 - XMLGregorianCalendar 到 java.util.Date?
【发布时间】:2017-11-22 17:32:16
【问题描述】:

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

【问题讨论】:

  • 我假设您的代码所做的是将您的转换器注册到该特定工厂,但映射器工厂在某些情况下可能会返回不同的工厂。您确定您的应用程序使用您注册的工厂吗?

标签: java date orika xmlgregoriancalendar


【解决方案1】:

我自己找到了答案。

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

【讨论】:

  • 转换器是否双向与单向转换无关,工厂仍然必须使用它配置的内容。看来,您有一个通过一些副作用起作用的解决方法。
【解决方案2】:

我认为您可能想将其作为问题报告给 Orika 人员,以便他们可以使用内置函数解决问题,或者以某种方式使其内置函数不会覆盖您注册的自定义转换器。

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

代码:

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

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

BuiltinConverters.register(converterFactory);

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-10-08
    相关资源
    最近更新 更多