Можно ли переопределить 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

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

+1
источник поделиться
2 ответа

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

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

+1
источник

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

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

Код:

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

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

BuiltinConverters.register(converterFactory);
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос