簡體   English   中英

Mapstruct:嵌套對象的自定義映射方法

[英]Mapstruct: custom mapping method for nested objects

我想使用 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]...; 
 }

但由於這些是嵌套對象,因此我收到一條錯誤消息,指出No property named "myObj2List.myObj3List.field1" exists in source parameter(s). 我一定是錯誤地制定了來源。 請問有什么幫助嗎?

您正在嘗試定義集合的映射。 MapStruct 不支持此功能。

使用時

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

你實際上是告訴MapStruct你想要的屬性myObj3ListmyObj2List使用。 然而, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM