You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MapStruct将RecipientDTO的AddressDTO映射至所有Subscription的Address

解决MapStruct中RecipientDTO到Recipient的映射需求

要实现将RecipientDTO中的AddressDTO赋值给Recipient.subscriptions列表里每个Subscription的Address字段,你可以通过以下两种方式处理:

方法一:自定义列表映射逻辑

直接在RecipientMapper中编写自定义的列表转换方法,手动调用带参数的SubscriptionMapper映射逻辑,显式传递AddressDTO:

@Mapper(uses = SubscriptionMapper.class)
public interface RecipientMapper {
    RecipientMapper INSTANCE = Mappers.getMapper(RecipientMapper.class);

    @Mapping(target = "subscriptions", source = ".")
    Recipient toRecipient(RecipientDTO recipientDTO);

    // 自定义列表映射,将RecipientDTO的address传递给每个Subscription
    default List<Subscription> mapSubscriptions(RecipientDTO dto) {
        return dto.getSubscriptions().stream()
                .map(subDto -> SubscriptionMapper.INSTANCE.toSubscription(subDto, dto.getAddress()))
                .collect(Collectors.toList());
    }
}

说明

  • @Mapping(target = "subscriptions", source = ".") 指定将整个RecipientDTO对象作为subscriptions字段的映射源,触发自定义的mapSubscriptions方法。
  • 自定义方法中遍历SubscriptionDTO列表,逐个调用带AddressDTO参数的映射方法,完成地址赋值。

方法二:使用@Context传递上下文参数

通过MapStruct的@Context注解传递共享的AddressDTO参数,让SubscriptionMapper自动接收该上下文参数:

1. 修改SubscriptionMapper

@Mapper
public interface SubscriptionMapper {
    SubscriptionMapper INSTANCE = Mappers.getMapper(SubscriptionMapper.class);

    @Mapping(target = "address", source = "addressDTO")
    Subscription toSubscription(SubscriptionDTO dto, @Context AddressDTO addressDTO);
}

2. 实现RecipientMapper

@Mapper(uses = SubscriptionMapper.class)
public interface RecipientMapper {
    RecipientMapper INSTANCE = Mappers.getMapper(RecipientMapper.class);

    // 核心映射方法,接收上下文参数AddressDTO
    Recipient toRecipient(RecipientDTO recipientDTO, @Context AddressDTO addressDTO);

    // 重载方法,自动将RecipientDTO的address作为上下文传递
    default Recipient toRecipient(RecipientDTO recipientDTO) {
        return toRecipient(recipientDTO, recipientDTO.getAddress());
    }
}

说明

  • @Context标记的参数会在整个映射链中传递,MapStruct会自动将其注入到SubscriptionMapper的映射方法中。
  • 重载的无参数方法简化了外部调用,无需手动传递AddressDTO。

两种方法都能实现你需要的映射效果,可根据实际场景选择:方法一逻辑直观,适合简单场景;方法二更符合MapStruct的上下文传递机制,适合复杂映射场景。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:12:11