2

我使用 MapStruct 映射器来做以下事情:

  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);

    }

}
4

0 回答 0