如何用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
相关产品推荐
相关产品推荐

