我想使用 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]...;
}
当 target
和 source
相同时,您不必定义它们,您可以只定义 target
和 qualifiedByName
关于java - Mapstruct:嵌套对象的自定义映射方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64648567/