java - 使用 Mapstruct 将 Collection 映射到 Map,反之亦然

标签 java mapping dto mapstruct

我正在使用 Mapstruct 来处理将一个 POJO 映射到另一个 POJO 的样板代码。

这是 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);

该接口(interface)还包含一个将 Attribute 映射到 AttributeTO 的方法,名称为 map

有没有更优雅的方法来实现不可迭代的MapCollection的转换?我的方法有效,但也有缺点。例如,重构无法识别字符串中的代码片段。

最佳答案

默认映射器方法怎么样?

在映射器接口(interface)中,您可以提供默认实现,指示 MapStruct 如何映射给定类型,例如:

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

每当 MapStruct 尝试从 Map 映射到 Collection 时,都会调用此方法。

您可以根据需要自由定制。

关于java - 使用 Mapstruct 将 Collection 映射到 Map,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915340/

相关文章:

java - Java 中的保形变换 - 圆盘到矩形

python - 在 Elasticsearch 中的所有字段上创建已分析和未分析索引

c++ - DirectX 11 - 点光阴影

c# - 如何在不使用 AutoMapper 的情况下手动映射 DTO?

java - 如何从公共(public)方法/函数返回 ArrayList

java - 如何使用java读取和写入Excel中的值?

java - 让方 block 在屏幕上移动

java - 字符和外来字符列表

c++ - 燕麦++ : put DTO in a list of DTOs

java - 使用枚举在 J2EE 应用程序中进行实体到 DTO 的转换?