Включить/выключить сопоставление нулей с помощью Orika?

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

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

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

Кто-нибудь знает лучший способ сделать это с помощью Orika? Буду признателен за любые предложения! Спасибо - Гэри.


person GaryC    schedule 03.06.2016    source источник


Ответы (1)


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

Я написал 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, если маппины равны Entity->DTO, и регистрирует новые мапперы, если они не были зарегистрированы ранее. На самом деле эта регистрация может быть где-то еще, но это просто PoC, и она выполняет свою работу.

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

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

person Ayhan APAYDIN    schedule 28.06.2016