如何使用@inheritinverseconfiguration和unmappedtargetpolicy=reportingpolicy.error忽略未Map的目标属性

n7taea2i  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(936)

我使用mapstruct mapper执行以下操作:
将实体Map到dto
将数据Map到实体以进行创建和更新操作
我准备好了 unmappedTargetPolicy = ReportingPolicy.ERROR 在mapperconfig中,如果某个对象未Map,则会收到通知。
实体到dtoMap自动Map所有dto的目标字段。我希望在反向Map(dto to entity)中应用完全相同的字段集。所以在这种情况下可以忽略未Map的目标字段。我用 @InheritInverseConfiguration 对于反向Map。它是有效的,但我必须明确地补充 @Mapping(target = "field1", ignore = true) 跳过dto中不存在的实体的目标字段。
如何避免手动添加忽略Map @InheritInverseConfiguration ? 我可以考虑申请 unmappedTargetPolicy = ReportingPolicy.IGNORE Map方法级和/或 @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 . 诀窍是使用额外的Map器 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);

    }

}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题