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