Java 如何使用@InheritInverseConfiguration和unappedTargetPolicy=ReportingPolicy.ERROR忽略未映射的目标属性

Java 如何使用@InheritInverseConfiguration和unappedTargetPolicy=ReportingPolicy.ERROR忽略未映射的目标属性,java,mapping,mapstruct,Java,Mapping,Mapstruct,我使用MapStruct mapper执行以下操作: 将实体映射到DTO 将数据映射到实体以进行创建和更新操作 我在MapperConfig中设置了unappedTargetPolicy=ReportingPolicy.ERROR,以便在某些内容未映射时得到通知 实体到DTO映射自动映射所有DTO的目标字段。我希望在反向映射(DTO到实体)中应用完全相同的字段集。因此,在这种情况下,可以忽略未映射的目标字段。我使用@inheritinverseconformation进行反向映射。它可以工作,但

我使用MapStruct mapper执行以下操作:

  • 将实体映射到DTO
  • 将数据映射到实体以进行创建和更新操作
  • 我在MapperConfig中设置了
    unappedTargetPolicy=ReportingPolicy.ERROR
    ,以便在某些内容未映射时得到通知

    实体到DTO映射自动映射所有DTO的目标字段。我希望在反向映射(DTO到实体)中应用完全相同的字段集。因此,在这种情况下,可以忽略未映射的目标字段。我使用
    @inheritinverseconformation
    进行反向映射。它可以工作,但我必须显式地添加
    @Mapping(target=“field1”,ignore=true)
    以跳过DTO中不存在的实体的目标字段

    如何避免为
    @inheritinverseconformation
    手动添加忽略映射?我可以考虑在映射方法级别和/或继承反向配置级别应用
    unappedTargetPolicy=ReportingPolicy.IGNORE
    。我在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中的一个示例找到了一个变通方法 . 诀窍是在
    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);
    
        }
    
    }