MapStruct: Как обновить ссылку на компонент вместо значений свойств - PullRequest
0 голосов
/ 09 апреля 2020

Народ,

У меня следующая ситуация с MapStruct: я хочу всегда обновлять поле новым экземпляром вместо установки значений в ранее существующем экземпляре.

Пример:

class A {
     B fieldB;
}

class B {
     String fieldString;
}

class ADTO {
     BDTO fieldB;
}

class BDTO {
     String fieldString;
}

У меня есть следующее сопоставление с MapStruct:

void copy(ADTO aDTO, @MappingTarget A a);

Полученный результат похож на:

if (aDTO.getFieldB()!= null) {
    if (a.getFieldB() == null) {
        a.setFieldB(new B());
    }
    bDTOToB(aDTO.getFieldB(), a.getFieldB());
} else {
    a.setFieldB(null);
}

Я хотел бы создать следующее :

if (aDTO.getFieldB()!= null) {
    a.setFieldB(new B());  // ALWAYS create a new B instance
    bDTOToB(aDTO.getFieldB(), a.getFieldB());
} else {
    a.setFieldB(null);
}

Я добавляю, что мне нужно 2 поведения: для некоторых полей мне подходит текущее поведение, то есть установить значения в существующем экземпляре. Для других полей мне нужно это изменение в поведении, как я упоминал ранее (a.setFieldB(newB())).

Возможно ли это сделать? Какая стратегия лучше?

1 Ответ

3 голосов
/ 11 апреля 2020

Единственный способ сделать это можно так:


    @BeforeMapping
    default void init( @MappingTarget A a ) {
        a.setFieldB( new B() );
    }

    void copy(ADTO aDTO, @MappingTarget A a);

@BeforeMapping установит ваше поле перед проверкой. Однако он будет не пропускать (теперь уже устарел) нулевую проверку цели в сгенерированном коде.

Нет способа контролировать проверку цели в MapStruct. NullValuePropertyMappingStrategy определяет, как нулевой источник должен обрабатываться в цели.

...