2016-06-03 4 views
0

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

Orika может поддерживать это с помощью метода mapNulls (true/false). Поэтому я подумал о создании двух отдельных фабрик-манипуляторов и создании mapNulls (false) на одном и mapNulls (true) с другой. Затем я бы повторил все одинаковые конфигурации сопоставления классов на обеих фабриках. Затем я могу выбрать подходящую фабрику, которая мне нужна во время выполнения, в зависимости от того, хочу ли я отображать нули или нет.

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

Кто-нибудь знает, как лучше это сделать с помощью Орики? Я бы оценил любые предложения! Спасибо -Gary.

ответ

0

У меня было подобное требование при попытке не устанавливать пустые поля в объекты JPA. Но reverse должен устанавливать нулевые значения, поступающие из базы данных. Я не знаю, нужна ли вам с «иногда». Но если у вас есть что-то идентифицировать (@Entity в моем случае), вам нужно сопоставить Nulls на ваших компонентах, вы можете использовать это.

Я написал ma.glasnost.orika.impl.ConfigurableMapper и переустановил один из методов map.

@Override 
    public <S, D> void map(S sourceObject, D destinationObject) { 
     if (!factory.existsRegisteredMapper(TypeFactory.valueOf(sourceObject.getClass()), TypeFactory.valueOf(destinationObject.getClass()), false)){ 
      ClassMapBuilder mapBuilder = factory.classMap(sourceObject.getClass(), destinationObject.getClass()); 
      mapBuilder.mapNulls(//Eğer Entity sınıfı ise 
       Arrays.stream(sourceObject.getClass().getDeclaredAnnotations()) 
         .map(annotation -> annotation.annotationType().equals(Entity.class)) 
         .map(value -> !value) 
         .reduce(Boolean::logicalOr) 
         .orElse(false) 
      ); 
      mapBuilder.mapNullsInReverse(//Eğer Entity sınıfı ise 
       Arrays.stream(destinationObject.getClass().getDeclaredAnnotations()) 
         .map(annotation -> annotation.annotationType().equals(Entity.class)) 
         .map(value -> !value) 
         .reduce(Boolean::logicalOr) 
         .orElse(false) 
      ); 
      mapBuilder.byDefault().register(); 
     } 
     super.map(sourceObject, destinationObject); 

    } 

Что она делает это в основном создает картограф, который mapNulls если mappins является Entity-> DTO и регистрирует новые картограф, если не зарегистрирован ранее. Фактически, эта регистрация может быть где-то в другом месте, но это просто PoC, и он выполняет эту работу.

И для примера при реализации ConfigurableMapper вы можете проверить эту ссылку. (Это на самом деле весной инъекционный пример картографа) https://github.com/dlizarra/orika-spring-integration/blob/master/src/main/java/com/dlizarra/orika/mapper/OrikaBeanMapper.java

(Хотел clearify свой вопрос, но не получил достаточно респ комментарий)