Java中如何使用MapStruct将字符串字段转为HashMap指定键对应值
实现方案
你可以通过以下两种常用方式实现需求,两个类中同名同类型的dateTime字段MapStruct会自动完成映射,无需额外配置:
方案1:直接使用表达式实现(适合简单场景)
固定key的场景
如果存入argument的key是固定值,直接在@Mapping注解中写表达式初始化Map即可:
@Mapper public interface AccountEventMapper { // 你原有已实现的转换方法 @Mapping(target = "accountNo", expression = "java(event.getArgument().get(key).toString())") AccountRequest eventToAccountRequest(Event event, String key); // 假设固定key为"accountNo" @Mapping(target = "argument", expression = "java(new java.util.HashMap<>(java.util.Map.of(\"accountNo\", accountRequest.getAccountNo())))") Event accountRequestToEvent(AccountRequest accountRequest); }
动态传key的场景
如果key需要在调用方法时动态传入,给方法新增key参数即可:
@Mapper public interface AccountEventMapper { @Mapping(target = "accountNo", expression = "java(event.getArgument().get(key).toString())") AccountRequest eventToAccountRequest(Event event, String key); @Mapping(target = "argument", expression = "java(new java.util.HashMap<>(java.util.Map.of(key, accountRequest.getAccountNo())))") Event accountRequestToEvent(AccountRequest accountRequest, String key); }
方案2:使用后置处理实现(适合复杂场景)
如果argument需要同时存入多个字段、或者要保留原有Map中的键值对,用@AfterMapping后置处理逻辑更易维护:
import org.mapstruct.AfterMapping; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; import java.util.HashMap; @Mapper public interface AccountEventMapper { @Mapping(target = "accountNo", expression = "java(event.getArgument().get(key).toString())") AccountRequest eventToAccountRequest(Event event, String key); Event accountRequestToEvent(AccountRequest accountRequest, String key); // 映射完成后自动执行该方法填充argument @AfterMapping default void fillArgument(@MappingTarget Event event, AccountRequest accountRequest, String key) { if (event.getArgument() == null) { event.setArgument(new HashMap<>()); } event.getArgument().put(key, accountRequest.getAccountNo()); } }
注意事项
- 两种方案都不需要额外配置
dateTime字段的映射规则,MapStruct会自动识别同名同类型字段完成转换 - 后置处理方案不会覆盖
argument中原有的键值对,适合后续扩展新增字段存入Map的场景
内容的提问来源于stack exchange,提问作者Faramarz Afzali
相关产品推荐
相关产品推荐

