【问题标题】:MapStruct fails to map a nested object which requires external variableMapStruct 无法映射需要外部变量的嵌套对象
【发布时间】:2019-11-12 16:09:08
【问题描述】:

我正在尝试使用 MapStruct 映射具有嵌套对象并需要外部变量的对象。

源 -> 目标映射是有损的,需要外部字符串

目标 -> 源映射工作并生成输出

我正在使用 Lombok,我的对象是不可变的。


//Entities
public class Repro {

    @Value
    @Builder
    public static class Nested {
        @NonNull
        private String id;
        @Nullable
        private String version;
        @NonNull
        private String externalId;
    }

    @Value
    @Builder
    public static class SourceEntity {
        @NonNull
        private String id;
        @NonNull
        private String anotherId;
    }

    @Value
    @Builder
    public static class TargetEntity {
        @NonNull
        private Nested nested;
        @NonNull
        private String anotherId;
    }
}
//Mapper

@Mapper
public interface ReproMapper {

    @Mapping(target = "nested.version", ignore = true)
    @Mapping(source = "source.id", target = "nested.id")
    @Mapping(source = "source.anotherId", target = "anotherId")
    @Mapping(source = "externalId", target = "nested.externalId")
    Repro.TargetEntity fromSource(Repro.SourceEntity source, String externalId);

    @Mapping(source = "nested.id", target = "id")
    @Mapping(source = "anotherId", target = "anotherId")
    Repro.SourceEntity fromTarget(Repro.TargetEntity target);
}

我收到错误消息(包名省略):

Can't map property "Repro.SourceEntity source" to "Repro.Nested nested". Consider to declare/implement a mapping method: "Repro.Nested map(Repro.SourceEntity value)

这告诉我要实现一个不可行的映射方法(因为它会构造一个部分 Nested 对象),该方法在 build() 调用期间会失败。

有没有办法使用 MapStruct 或者我只是实现自己的映射器?

【问题讨论】:

    标签: java lombok mapstruct


    【解决方案1】:

    你可以这样试试(手写方法icm @MappingContext传下externalId:

    @Mapper
    public interface ReproMapper {
    
        @Mapping(target = "nested",source = "source")
        @Mapping(target = "anotherId",source = "source.anotherId")
        Repro.TargetEntity fromSource(Repro.SourceEntity source, @Context String externalId);
    
        //A default impl that delegates to MapStruct generated method
        default Repro.TargetEntity.Nested resolveNested(Repro.SourceEntity source, @Context String externalId) {
            return delegate(source, externalId);
        }
    
        //Actual Mapping method, generated by MapStruct
        //Note here externalId is not @Context annotated
        @Mapping(target = "version", ignore = true)
        @Mapping(target = "id", source = "source.id")
        @Mapping(target = "externalId", source = "externalId")
        Repro.TargetEntity.Nested delegate(Repro.SourceEntity source, String externalId)
    
        @Mapping(source = "nested.id", target = "id")
        @Mapping(source = "anotherId", target = "anotherId")
        Repro.SourceEntity fromTarget(Repro.TargetEntity target);
    }
    

    【讨论】:

    • 发送了一个带有工作示例的编辑,但这有效。谢谢!
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2018-09-15
    相关资源
    最近更新 更多