MapStruct转换DTO时List<String>转String映射报错如何解决
报错原因
你的写法存在两个核心问题导致编译报错:
- 多余的错误映射配置:
@Mapping(target = "messageDTO", source = "messageDTO")完全无效,你的入参中没有名为messageDTO的对象,会干扰MapStruct的默认匹配逻辑。 - 字段匹配冲突:方法入参中的
String identifier和源DTO的List<String> identifiers名称高度相似,MapStruct默认按名称匹配时逻辑混乱,错误尝试将String类型转为List类型,和实际需要的转换方向完全相反。
解决方案
根据你的实际业务需求选对应配置即可:
场景1:将源DTO的List<String> identifiers转为逗号拼接的字符串赋值给目标字段
不需要用到入参中的identifier可以直接删除该参数,避免冲突,配置如下:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Named; import java.util.List; @Mapper(componentModel = "spring") // 不使用Spring容器可以去掉componentModel配置 public interface MessageMapper { // 方式1:直接在expression中写转换逻辑 @Mapping(target = "identifiers", expression = "java(String.join(\",\", m.getIdentifiers()))") @Mapping(target = "clientToken", source = "clientToken") MessagetoMqDTO toDto(MessageRqDTO m, String clientToken); // 方式2:自定义转换方法更灵活(推荐,可处理空值等边界情况) /* @Mapping(target = "identifiers", source = "m.identifiers", qualifiedByName = "listToStr") @Mapping(target = "clientToken", source = "clientToken") MessagetoMqDTO toDto(MessageRqDTO m, String clientToken); @Named("listToStr") default String listToString(List<String> list) { if (list == null || list.isEmpty()) { return ""; } return String.join(",", list); } */ }
场景2:直接用方法入参的identifier赋值给目标的identifiers字段
不需要源DTO的identifiers字段,配置如下:
@Mapper(componentModel = "spring") public interface MessageMapper { @Mapping(target = "identifiers", source = "identifier") @Mapping(target = "clientToken", source = "clientToken") MessagetoMqDTO toDto(MessageRqDTO m, String identifier, String clientToken); }
两种方式都会自动映射两个DTO中名称、类型完全一致的其余字段,不需要额外配置。
内容的提问来源于stack exchange,提问作者Armin Nouri
相关产品推荐
相关产品推荐

