Можно ли переопределить встроенный конвертер Orika - XMLGregorianCalendar в 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

Кто-нибудь знает, можно ли заставить Орику использовать мой способ сопоставления этих двух типов?


person Michał Łodyga    schedule 20.06.2017    source источник
comment
Я предполагаю, что ваш код делает то, что он регистрирует ваш преобразователь на этой конкретной фабрике, но в некоторых случаях фабрика картографов может возвращать разные фабрики. Вы уверены, что ваше приложение использует фабрику, в которой вы зарегистрированы?   -  person M. Prokhorov    schedule 20.06.2017


Ответы (2)


Я нашел ответ сам.

Дело в том, что встроенный конвертер является «двунаправленным конвертером», и я использовал «CustomConverter», потому что меня интересовало изменение отображения только одним способом: XML -> Дата. Изменение его на двунаправленное решило проблему.

person Michał Łodyga    schedule 20.06.2017
comment
Двунаправленный преобразователь или нет, не имеет значения для одностороннего преобразования, завод все равно должен использовать то, с чем он был сконфигурирован. Кажется, у вас есть обходной путь, который работает через какой-то побочный эффект. - person M. Prokhorov; 20.06.2017

Я думаю, вы, возможно, захотите сообщить об этом ребятам из Orika, чтобы они могли либо исправить проблему с помощью своей встроенной программы, либо каким-то образом сделать так, чтобы их встроенные программы не переопределяли пользовательские конвертеры, которые вы регистрируете.

В качестве обходного пути я предлагаю вам отключить использование встроенных модулей в сборщике и зарегистрировать встроенные преобразователи только после того, как вы зарегистрируете все свои пользовательские преобразователи и переопределения. Это должно (по крайней мере, судя по тому, как в настоящее время работает их DefaultConverterFactory) дать вашим пользовательским конвертерам приоритет, необходимый для подавления встроенных функций.

Код:

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

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

BuiltinConverters.register(converterFactory);
person M. Prokhorov    schedule 20.06.2017