当前位置: 首页 > 知识库问答 >
问题:

使用Mapstruct将集合映射到Map,反之亦然

法浩壤
2023-03-14

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

我正在寻找一种优雅的方法来处理映射集合之间的映射。目前,我正在使用@Mapping注释的表达式属性。由于Attribute引用了Test我使用的是“周期映射”示例中的cyclebrakingContext

@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);

该界面还包含一个方法映射属性属性到,名称为映射

有没有更优雅的方法来实现将不可编辑的映射转换为集合?我的方法可行,但也有缺点。例如,重构不能识别字符串中的代码片段。

共有1个答案

谭建章
2023-03-14

默认映射器方法如何?

在mapper界面中,可以提供默认实现,指示MapStruct如何映射给定类型,例如:

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

每当MapStruct试图从映射映射到集合时,就会调用此方法。

你可以随心所欲地定制它。

 类似资料:
  • 拥有Maapstruct映射接口和带有各种枚举的DTO。我有两个不同的枚举,它们的格式都是: 但它显然不知道要用参数字符串代码映射到的枚举。希望我能: 只做toEntity(fromDto)和toDto(fromStringCode,forDtoTypeAndFile) 只为每个类型添加代码,而不为每个源/目标添加代码

  • 我提到了用Mapstruct将多个源字段映射到同一类型目标字段的问题,但这没有帮助 我的rest资源类如下所示 我的实体类是源代码,如下所示: 我想在mapper类中用emailAdddress或devices或mobileNumbers映射源类中的地址,我尝试在mapper类中使用@AfterMapping和一个decorator类,但它没有帮助。 我有一个像这样的映射器类

  • 本文向大家介绍Scala将Scala集合转换为Java集合,反之亦然,包括了Scala将Scala集合转换为Java集合,反之亦然的使用技巧和注意事项,需要的朋友参考一下 示例 当您需要将集合传递到Java方法中时: 如果Java代码返回Java集合,则可以通过类似的方式将其转换为Scala集合: 请注意,这些是装饰器,因此它们仅将基础集合包装在Scala或Java集合接口中。因此,通话.asJa

  • 我得到以下情况: 源类: null

  • 我可以想象这样一个解决方案:一个子映射器,在这个映射器中,我用如下所示的查找重写Dto to Domain方法: 但目标在MapStruct中是必需的。也许我可以以某种方式指定整个对象作为目标?

  • 我们已经了解了以下复杂的数据结构: 存储带键的数据(keyed)集合的对象。 存储有序集合的数组。 但这还不足以应对现实情况。这就是为什么存在 Map 和 Set。 Map Map 是一个带键的数据项的集合,就像一个 Object 一样。 但是它们最大的差别是 Map 允许任何类型的键(key)。 它的方法和属性如下: new Map() —— 创建 map。 map.set(key, value