MapStruct中List集合映射如何使用@Named注解消除方法歧义
MapStruct集合转换指定元素转换方法的解决方案
错误原因
你使用了错误的注解配置:@Mapping 注解是用于单个对象内部的字段映射规则配置,强制要求指定target属性对应目标类的字段名,因此直接加在List类型的转换方法上会触发必填参数校验错误。
正确实现
集合/迭代类型的转换规则需要用@IterableMapping注解配置,该注解专门用于集合类转换的全局规则指定,支持qualifiedByName属性绑定@Named标注的单个元素转换方法,示例代码如下:
// 使用@IterableMapping配置集合元素转换的限定器 @IterableMapping(qualifiedByName = "LineTestBO") List<ReturnABO> toCaptureLineItemsBOs(List<LineDTO> lineDTO); @Named("LineTestBO") default ReturnABO map(LineDTO lineDTO) { // 注意调整空判断顺序:先判断lineDTO本身非空再调用其getter方法,避免空指针异常 if (lineDTO != null && lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null && lineDTO.getAmount() != null) { return this.toBO(lineDTO); } return null; } default ReturnABO toBO(LineDTO lineDTO) { // 原有业务逻辑 }
配置后MapStruct生成集合转换实现时,会自动遍历所有元素,调用@Named("LineTestBO")标注的转换方法处理每个元素,不会和同入参出参类型的toBO方法产生转换歧义。
额外注意
如果是Map类型的转换需要指定KV转换规则,可以使用@MapMapping注解,用法和@IterableMapping类似。
内容的提问来源于stack exchange,提问作者Mohammed Sardar
相关产品推荐
相关产品推荐

