Mapstruct:忽略MapperConfig

标签 mapstruct

我有两个MapperConfig:

@MapperConfig(
    uses = {
        StringTypeMapper.class,
        ExtensionMapper.class
    }
)
public interface ElementMapperConfig extends GenericMapperConfig {
    
    @Mapping(target = "id", source = "idElement")
    @Mapping(target = "extension", source = "extension")
    Element mapElement(org.hl7.fhir.r4.model.Element fhir);

}

GenericMapperConfig:

@MapperConfig(
    componentModel = "spring",
    injectionStrategy = InjectionStrategy.CONSTRUCTOR,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
    nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL
)
public interface GenericMapperConfig {

}

如您所见,我正在使用 spring 组件模型。

尽管如此,Mapper 实现正在使用 Mappers.getMapper(...) 获取所需的 Mapper。

如您所见,ElementMapperConfig 扩展了 GenericMapperConfig,但似乎忽略了 GenericMapperConfig 中的配置。

生成的映射器示例:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor"
)
public class StringTypeMapperImpl implements StringTypeMapper {

    private final ExtensionMapper extensionMapper = Mappers.getMapper( ExtensionMapper.class );

}

StringTypeMapper 是:

@Mapper(
    config = ElementMapperConfig.class
)
public interface StringTypeMapper {

    @InheritConfiguration(name = "mapElement")
    StringType fhirToMpi(org.hl7.fhir.r4.model.StringType stringType);

}

我不太明白为什么 GenericMapperConfig 配置没有填充,我的意思是,我不明白为什么 componentModel = "spring" 上被忽略>映射器实现。

最佳答案

文档没有提到这种组合多个MapperConfiguration的方式。

它也没有提到另一种方法,但这个方法有效。这个想法是扩展映射器而不是配置。

引入具有通用配置的基础映射器:

@Mapper(
    config = GenericMapperConfig.class
)
public interface BaseMapper {
}

将您的具体映射器建立在基础映射器的基础上,并使用特定配置对其进行配置:

@Mapper(
    config = ElementMapperConfig.class
)
public interface StringTypeMapper extends BaseMapper {
    @InheritConfiguration(name = "mapElement")
    StringType fhirToMpi(org.hl7.fhir.r4.model.StringType stringType);
}

最后让ElementMapperConfig不继承GenericMapperConfig:

@MapperConfig(
    uses = {
        StringTypeMapper.class,
        ExtensionMapper.class
    }
)
public interface ElementMapperConfig {
    @Mapping(target = "id", source = "idElement")
    @Mapping(target = "extension", source = "extension")
    Element mapElement(org.hl7.fhir.r4.model.Element fhir);
}

关于Mapstruct:忽略MapperConfig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70345493/

相关文章:

java - 自动映射除一个字段之外的所有字段,该字段应通过其他函数传递

java - 使用构建器和 MapStruct 将 null 值映射到默认值

java - 推土机升级到mapstruct

java - 当映射器类具有多个具有常量返回类型的方法时,常量不起作用

java - 使用 MapStruct 将 2 个字符串字段映射到 OffsetDateTime

java - 运行 mvn install/mvn test 时出现 Maven mapstruct 问题

java - @Mapping @Mapper 错误 不存在源参数

java - 如何在 mapstruct 中使用来自不同类的另一个映射

mapstruct:使用来自 DTO 的数据更新实体的现有字段

java - 简化和改进数据类型映射器的单元测试