Как игнорировать не сопоставленные свойства цели, используя @InheritInverseConfiguration и unmappedTargetPolicy = ReportingPolicy .ОШИБКА

#java #mapping #mapstruct

#java #сопоставление #mapstruct

Вопрос:

Я использую MapStruct mapper для выполнения следующих действий:

  1. сопоставить объект с DTO
  2. сопоставьте DTO с объектом для операций создания и обновления

Я установил unmappedTargetPolicy = ReportingPolicy.ERROR в MapperConfig получать уведомления, если что-то не сопоставлено.

Сопоставление объекта с DTO автоматически отображает все целевые поля DTO. Я хочу применить точно такой же набор полей в обратном отображении (DTO к сущности). Так что в данном случае можно игнорировать несопоставленные целевые поля. Я использую @InheritInverseConfiguration для инвертированного сопоставления. Это работает, но я должен явно добавить @Mapping(target = "field1", ignore = true) , чтобы пропустить целевые поля объекта, не существующие в DTO.

Как избежать добавления игнорирования сопоставлений вручную для @InheritInverseConfiguration ? Я могу подумать о применении unmappedTargetPolicy = ReportingPolicy.IGNORE на уровне метода сопоставления и / или @InheritInverseConfiguration уровне. Я не нашел такой возможности в аннотациях MapStruct.

 @MapperConfig(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.ERROR,
        typeConversionPolicy = ReportingPolicy.ERROR)
public interface CommonMapperConfig {
}


@Mapper(config = CommonMapperConfig.class)
public interface AnimalMapper {

    AnimalDto getAnimal(Animal animal);

    @InheritInverseConfiguration
    @Mapping(target = "id", ignore = true)
    // todo how to avoid explicitly ignore of field?
    @Mapping(target = "field1", ignore = true)
    @Mapping(target = "field2", ignore = true)
    Animal createAnimal(AnimalDto animalDto);

    @InheritConfiguration
    void updateAnimal(AnimalDto animalDto, @MappingTarget Animal animal);

}
 

Обновление 1. Я нашел обходной путь, основанный на примере в git https://github.com/mapstruct/mapstruct-examples/blob/master/mapstruct-suppress-unmapped/src/main/java/org/mapstruct/jpa/SourceTargetMapper.java
. Хитрость заключается в использовании дополнительного средства сопоставления с unmappedTargetPolicy = ReportingPolicy.IGNORE .

Интересно, что

 @Mapper(config = CommonMapperConfig.class, uses = AnimalMapper.ChangeAnimalMapper.class)
public abstract class AnimalMapper {

    @Autowired
    ChangeAnimalMapper changeAnimalMapper;

    public abstract AnimalDto getAnimal(Animal animal);

    public Animal createAnimal(AnimalDto animalDto) {
        return changeAnimalMapper.createAnimal(animalDto);
    }

    public void updateAnimal(AnimalDto animalDto, @MappingTarget Animal animal) {
        changeAnimalMapper.updateAnimal(animalDto, animal);
    }

    /**
     * Internal mapper to avoid unmapped target errors for inverse mappings
     */
    @Mapper(config = CommonMapperConfig.class, unmappedTargetPolicy = ReportingPolicy.IGNORE)
    public interface ChangeAnimalMapper {

        @InheritInverseConfiguration
        @Mapping(target = "id", ignore = true)
        Animal createAnimal(AnimalDto animalDto);

        @InheritConfiguration
        void updateAnimal(AnimalDto animalDto, @MappingTarget Animal animal);

    }

}