gpt4 book ai didi

java - MapStruct 无法映射需要外部变量的嵌套对象

转载 作者:行者123 更新时间:2023-11-30 05:34:56 25 4
gpt4 key购买 nike

我正在尝试使用 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)

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

有没有办法使用 MapStruct 解决这个问题,或者我只是实现自己的映射器?

最佳答案

你可以这样尝试(手写方法 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);
}

关于java - MapStruct 无法映射需要外部变量的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56845204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com