2017-08-28 131 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

感谢您的回答!我在界面中使用了错误。我的错......这种方法是正确的方法。 –