Лучший шаблон для средства обновления Mapstruct, когда поле не может быть создано/построено без параметровJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Лучший шаблон для средства обновления Mapstruct, когда поле не может быть создано/построено без параметров

Сообщение Anonymous »

Простой картограф, который также предоставляет и «обновляет» картограф

Код: Выделить всё

@Mapper(componentModel = "spring", uses = "EngineMapper.class")
public interface CarMapper {

CarEntity carDtoToCarEntity(CarDto car);

// Update mapper
@InheritConfiguration(name = "carDtoToCarEntity")
@BeanMapping( nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE , unmappedTargetPolicy = ReportingPolicy.IGNORE)
void updateCarEntityFromCarDto(CarDto car, @MappingTarget CarEntity carEntity);
}
Результирующий сгенерированный преобразователь обновлений выглядит примерно так:

Код: Выделить всё

@Override
void updateCarEntityFromCarDto(CarDto carDto, @MappingTarget CarEntity carEntity) {
if ( carDto == null ) {
return;
}

if( carDto.getEngine() != null ) {
if ( carEntity.getEngine() == null ) {
unit.setEngine( Engine.builder().build() ); // Notice this line
}
updateEngineEntityFromEngineDto( carDto.getEngine(), carEntity.getEngine() );
}
...
}
Но наш класс Engine не имеет общедоступного конструктора без аргументов и имеет обязательные поля с Lombock @NonNull
Итак, построитель (без аргументов) выдает NPE.
Я могу добавить фабрику Engine следующим образом:

Код: Выделить всё

@ObjectFactory
default EngineEntity createEngineEntity(EngineDto engineDto) {
return engineDtoToEngineEntity( engineDto );  // Call the engine mapper
}
И сгенерированный метод обновления теперь работает:

Код: Выделить всё

@Override
void updateCarEntityFromCarDto(CarDto carDto, @MappingTarget CarEntity carEntity) {
if ( carDto == null ) {
return;
}

if( carDto.getEngine() != null ) {
if ( carEntity.getEngine() == null ) {
unit.setEngine( createEngineEntity( carDto.getEngine() ) ); // Fixed
}
updateEngineEntityFromEngineDto( carDto.getEngine(), carEntity.getEngine() );
}
...
}
Однако это означает, что будет вызван engineDtoToEngineEntity (для создания/сопоставления нового EngineEntiy)
а затем будет следовать updateEngineEntityFromEngineDto, который будет без необходимости запускать логику, чтобы убедиться,
убедиться, что он обновлен (по сути, делая одно и то же дважды).
Я не мог понять, как сделать сгенерированный оператор 'if' стал if/else оператор, чтобы предотвратить дублирование работы.
Есть ли лучший шаблон/решение?

Подробнее здесь: https://stackoverflow.com/questions/798 ... uilt-witho
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»