我使用 MapStruct 映射器来做以下事情:
- 将实体映射到 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);
}
}