#java #mapping #mapstruct
#java #сопоставление #mapstruct
Вопрос:
Я использую MapStruct mapper для выполнения следующих действий:
- сопоставить объект с DTO
- сопоставьте 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);
}
}