java - Mapstruct:嵌套对象的自定义映射方法

标签 java nested mapping mapstruct

我想使用 mapstruct 在这些对象之间进行映射:

MyObj1
-List<MyObj2> myObj2List
--List<MyObj3> myObj3List
---string field1

MyObj4
-List<MyObj5> myObj5List
--List<MyObj6> myObj6List
---int field1

问题:我能否以某种方式告诉 mapstruct 将 field1 从字符串映射到 int,而不是默认的 Integer.parseInt(...)

改变内部对象的类型不是一个选项。 我知道有一个注释

 @Mapping(source = "myObj2List.myObj3List.field1", target = "myObj5List.myObj6List.field1", qualifiedByName = "methodToMapWith")
 public MyObj4 field1Mapper(MyObj1input);
    
 @Named("methodToMapWith") 
 public static int methodToMapWith(string input) { 
    return ...[custom logic]...; 
 }

但由于这些是嵌套对象,因此我收到一条错误消息,提示 源参数中不存在名为“myObj2List.myObj3List.field1”的属性。 我一定是错误地表述了源。有什么帮助吗?

最佳答案

您正在尝试定义集合的映射。 MapStruct 不支持此功能。

使用时

@Mapping(source = "myObj2List.myObj3List.field1", target = "myObj5List.myObj6List.field1", qualifiedByName = "methodToMapWith")

您实际上是在告诉 MapStruct 您希望使用 myObj2List 中的属性 myObj3List。但是,myObject2List 不是一个 bean,而是一个集合。

您实际上是要告诉 MapStruct 将映射传递给为单个元素创建的可迭代映射。

我认为有一个功能请求支持类似的东西。

为了支持您的需要,您需要在不同对象之间添加映射方法。

例如

 @Mapping(source = "myObj2List", target = "myObj5List")
 public MyObj4 field1Mapper(MyObj1 input);

 @Mapping(source = "myObj3List", target = "myObj6List")
 public MyObj5 map(MyObj2 input);

 @Mapping(target = "field1", qualifiedByName = "methodToMapWith")
 public MyObj6 map(MyObj3 input);
    
 @Named("methodToMapWith") 
 public static int methodToMapWith(string input) { 
    return ...[custom logic]...; 
 }

targetsource 相同时,您不必定义它们,您可以只定义 targetqualifiedByName

关于java - Mapstruct:嵌套对象的自定义映射方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64648567/

相关文章:

c++ - 正在编译具有相同迭代器的嵌套循环,这是为什么?

python - 给定 Python 中的列表列表,返回最大长度的唯一值子列表

Python 对嵌套字典中的值求和

java - 如何将 MyPojo 对象作为对 map 方法的引用传递?

JAVA8,解析文本文件并将其值解析为对象

mapping - 我可以为 java.util.Map 自定义 JAXB @XmlElementWrapper 元素吗

Java:压缩一个 HashMap(类似于 ArrayList#trimToSize)

java - 如何使用 pdfbox 2.0.16 设置 PDAnnotationFreeText 的字体颜色

java - Netbeans 构建过程似乎每次都会重建所有 Jars

java - yml 中的 KeyStore 配置