【问题标题】:How to implement a partial custom mapping with MapStruct?如何使用 MapStruct 实现部分自定义映射?
【发布时间】:2021-12-05 16:07:51
【问题描述】:

我希望 MapStruct 映射我的 Object 的每个属性,除了一个我想为其提供自定义映射的特定属性

到目前为止,我自己实现了整个映射器,但是每次向我的实体添加新属性时,我都忘记更新映射器了。

@Mapper(componentModel = "cdi")
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    default MyDto toDTO(MyEntity myEntity){
        MyDto dto = new MyDto();
        dto.field1 = myEntity.field1;
        // [...]
        dto.fieldN = myEntity.fieldN;

        // Custom mapping here resulting in a Map<> map
        dto.fieldRequiringCustomMapping = map;

    }
}

有没有办法将我的字段 fieldRequiringCustomMapping 的映射外包出去,并告诉 MapStruct 像往常一样映射所有其他的? ????

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    MapStruct 可以在某些字段之间使用自定义映射。因此,在您的情况下,您可以执行以下操作:

    @Mapper(componentModel = "cdi")
    public interface MyMapper {
    
        @Mapping(target = "fieldRequiringCustomMapping", qualifiedByName = "customFieldMapping")
        MyDto toDTO(MyEntity myEntity);
    
        // The @(org.mapstruct.)Named is only needed if the Return and Target type are not unique
        @Named("customFieldMapping")
        default FieldRequiringCustomMapping customMapping(SourceForFieldRequiringCustomMapping source) {
            // Custom mapping here resulting in a Map<> map
            return map
        }
        
    }
    

    我不知道您的fieldRequiringCustomMapping 需要映射什么,该示例假设您在MyEntity 中也有这样一个字段,如果不是这种情况,您需要将source 添加到@Mapping


    旁注:在您的情况下使用非默认 componentModel cdi 时,不建议使用 Mappers 工厂。如果您在映射器中使用它们,它不会执行其他映射器的注入。

    【讨论】:

    • 这正是我想要的。非常感谢。
    猜你喜欢
    • 2021-11-19
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2018-09-14
    • 1970-01-01
    • 2017-11-09
    • 2021-05-19
    相关资源
    最近更新 更多