Как рекурсивно обновлять вложенные объекты из одного объекта другим, используя mapstruct или modelmapper? - PullRequest
0 голосов
/ 27 декабря 2018

Лучше я объясню свою задачу на примере того, что я хочу получить.Можно ли решить эту проблему с помощью mapstruct / modelmapper / etc?

class Person{
    String name;
    Address address;
}

class Address{
    String street;
    Integer home;
}

Обновления:

{
    name: "Bob"
    address: {
                 street: "Abbey Road"
             }
}

Цель:

{
    name: "Michael"
    address: {
                 street: "Kitano"
                 home: 5
             }
}

И как результат я хочу получить:

{
    name: "Bob"
    address: {
                 street: "Abbey Road"
                 home: 5
             }
}

Не должен переписывать объект Address.Он рекурсивно устанавливает новые значения в нем.

1 Ответ

0 голосов
/ 03 января 2019

Да, вы можете использовать Обновление существующих экземпляров компонента из MapStruct для выполнения необходимых обновлений.

Отображатель будет выглядеть следующим образом:

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface PersonMapper {

    void update(@MappingTarget Person toUpdate, Person person);

    void update(@MappingTarget Address toUpdate, Address address);
}

сгенерированный код для этого будет выглядеть следующим образом:

public class PersonMapperImpl implements PersonMapper {

    @Override
    public void update(Person toUpdate, Person person) {
        if ( person == null ) {
            return;
        }

        if ( person.getName() != null ) {
            toUpdate.setName( person.getName() );
        }
        if ( person.getAddress() != null ) {
            if ( toUpdate.getAddress() == null ) {
                toUpdate.setAddress( new Address() );
            }
            update( toUpdate.getAddress(), person.getAddress() );
        }
    }

    @Override
    public void update(Address toUpdate, Address address) {
        if ( address == null ) {
            return;
        }

        if ( address.getStreet() != null ) {
            toUpdate.setStreet( address.getStreet() );
        }
        if ( address.getHome() != null ) {
            toUpdate.setHome( address.getHome() );
        }
    }
}
  • nullValuePropertyMappingStrategy - стратегия, которая будет применяться, когда свойство исходного компонента null или отсутствует.По умолчанию задано целевое значение null
  • nullValueCheckStrategy - Определяет, когда включать проверку null в значение свойства источника для отображения bean-компонента

NB nullValuePropertyMappingStrategy взято из MapStruct 1.3.0.Beta2

...