Код: Выделить всё
@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() );
}
...
}
Итак, построитель (без аргументов) выдает 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() );
}
...
}
а затем будет следовать updateEngineEntityFromEngineDto, который будет без необходимости запускать логику, чтобы убедиться,
убедиться, что он обновлен (по сути, делая одно и то же дважды).
Я не мог понять, как сделать сгенерированный оператор 'if' стал if/else оператор, чтобы предотвратить дублирование работы.
Есть ли лучший шаблон/решение?
Подробнее здесь: https://stackoverflow.com/questions/798 ... uilt-witho
Мобильная версия