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

多源MapStruct映射器

余信然
2023-03-14

假设我需要将两个对象映射成一个或一个对象映射成一个(重载)。我可以通过以下映射来实现:

@Mapper
public interface ThingMapper
{
    @Mappings(
        {
            @Mapping(source = "createdDateTime", target = "thingDate"),
            @Mapping(source = "approver.id", target = "approverId"),
        })
    ThingEventPayload toEventPayload(Thing thing);

    // TODO this is redundant, how to clean up?
    @Mappings(
        {
            // since there are two params, need to specifically map same-named params from source "thing" to target
            @Mapping(source = "thing.id", target = "id"),
            @Mapping(source = "thing.deletedDateTime", target = "deletedDateTime"),
            @Mapping(source = "thing.version", target = "version"),
            @Mapping(source = "thing.autoApproved", target = "autoApproved"),
            @Mapping(source = "thing.resolvedDate", target = "resolvedDate"),
            @Mapping(source = "thing.status", target = "status"),

            // numerous other fields mapping from source "thing" to target with same property name

            // map differently named parameters (duplicate of other mapper, above)
            @Mapping(source = "thing.createdDateTime", target = "thingDate"),
            @Mapping(source = "thing.approver.id", target = "approverId"),

            // mapping second parameter "owner" directory to target "owner" property
            @Mapping(source = "owner", target = "owner"),
        })
    ThingEventPayload toEventPayload(Thing thing, User owner);
}

是否有一种方法可以更改第二个映射器“先做第一个映射器”,然后应用@mapping(source=“owner”,target=“owner”)的附加映射?

共有1个答案

苏鸿波
2023-03-14

在这种情况下,您可以使用自定义方法。

例如

@Mapper
public interface ThingMapper {
    @Mappings(
        {
            @Mapping(source = "createdDateTime", target = "thingDate"),
            @Mapping(source = "approver.id", target = "approverId"),
        })
    ThingEventPayload toEventPayload(Thing thing);

    UserPayload toUserPayload(User user);

    default ThingEventPayload toEventPayload(Thing thing, User owner) {
        ThingEventPayload eventPayload = toEventPayload(thing);
        if (eventPayload != null) {
            eventPayload.setOwner(toUserPayload(owner));
        }
        return eventPayload;
    }
}
 类似资料:
  • 我有一个关于mapstruct中@ManyToOne映射的问题。我有两个表 第一个: 第二个是: 我有一个这样的箱子: 和MemberDto作为实体相同。 我需要使用mapstruct进行如下映射: 我需要填写名单成员;但我不明白怎么做。

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • Mapstruct在Spring-Boot rest api中使用一对多和多对一关系映射我的实体时遇到了一个问题。 我有下面的课 因此,当我在评论中添加私有UserDTO用户时;进入PolicyDTO和公共列表PolicyList;进入UserDTO 结果策略列出了所有字段中的值都可以,当然,除了两个注释字段。如果我用双向关系将这两个字段取消注释到DTO中,结果不仅在关系字段中是null,而且在所

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->

  • 下面的例子中,我有一个单独的域层和一个单独的持久层。我使用Mapstruct进行映射,当从域映射到实体或从实体映射到域时,会出现堆栈溢出,因为双向引用总是被调用- 用于映射的类非常基本

  • 我想将泛型类型<code>Y</code>的对象映射到另一个泛型类型为<code>X</code>的对象。在mapstruct中有这样的功能吗?或者我必须为通用映射编写自定义映射器吗?当我编译上面的代码时,会出现编译错误。