2017-08-28 80 views
1

我正在使用Mapstruct來處理將一個POJO映射到另一個POJO的樣板代碼。將集合映射到Map並反之亦然使用Mapstruct

這裏是DTO:

import java.util.Collection; 

public class TestTO { 
    String name; 
    Collection<AttributeTO> attributes; 
} 

這裏是映射的POJO:

import java.util.Map; 

public class Test { 
    String name; 
    Map<String, Attribute> attributes; 
} 

我正在尋找一個優雅的方式來處理MapCollection之間的映射。目前,我正在使用@Mapping註釋的expression屬性。由於Attribute引用Test我正在使用「映射與循環」示例中的CycleBreakingContext

@Mapping(target = "attributes", expression = "java(test.getAttributes().values().stream().map(a -> this.map(a, context)).collect(java.util.stream.Collectors.toList()))") 
abstract TestTO map(Test test, @Context CycleBreakingContext context); 

該接口還包含方法映射到AttributeAttributeTO名稱map

是否有一種更優雅的方式來實現非迭代MapCollection的轉換?我的方法正在工作,但有缺點。例如,重構不能識別字符串中的代碼片段。

回答

2

默認的映射器方法如何?

在你的映射器接口可以提供默認的實現就如何映射給定類型,例如指示MapStruct:

default Collection<Integer> mapAttributes(Map<String, Integer> attributes) { 
    return attributes.values(); 
} 

每當MapStruct試圖映射從地圖收藏此方法將被調用。

您可以自由定製它,只要你想。

+0

如果我將此添加到我的接口,在編譯期間出現以下錯誤:無法生成從非可迭代類型到可迭代類型的映射方法。 –

+0

這很奇怪,你確定要用'default'關鍵字添加它嗎?使用'default'的替代方法是使用util類和靜態方法(如果映射是無狀態的話)。 – Filip

+0

感謝您的回答!我在界面中使用了錯誤。我的錯......這種方法是正確的方法。 –

相關問題