Mapstruct 1.2.0.Final:如何提取对象属性并映射为目标对象实例
解决MapStruct提取ExternalResult中items并转为MyItem列表的问题
针对你的需求,MapStruct可以很优雅地实现这个映射,下面给你两种常用的实现方式,都能满足从ExternalResult中提取items并转换为List<MyItem>的需求:
前提:补全Item类定义
首先假设你的Item类包含name属性(因为要映射到MyItem的name),定义如下:
@Data public class Item { private String name; // 其他业务属性... }
方式一:使用Default方法手动提取+自动列表映射
这种方式逻辑清晰,先定义单个对象的映射规则,再通过default方法完成列表的提取和批量转换:
@Mapper(componentModel = "spring") public interface MyItemMapper { // MapStruct会自动实现Item到MyItem的属性映射(属性名一致无需额外配置) MyItem itemToMyItem(Item item); // 自定义default方法,从ExternalResult中提取items并转换 default List<MyItem> externalResultToMyItems(ExternalResult externalResult) { // 空值判断避免空指针异常 if (externalResult == null || externalResult.getItems() == null) { return Collections.emptyList(); } // 调用单个对象映射方法批量转换 return externalResult.getItems().stream() .map(this::itemToMyItem) .collect(Collectors.toList()); } }
方式二:用@Mapping注解直接指定源属性
这种方式更简洁,通过@Mapping注解告诉MapStruct直接取ExternalResult的items属性作为目标列表的数据源:
@Mapper(componentModel = "spring") public interface MyItemMapper { // 单个对象映射规则(MapStruct自动实现) MyItem itemToMyItem(Item item); // MapStruct自动实现List<Item>到List<MyItem>的批量转换 List<MyItem> itemsToMyItems(List<Item> items); // 直接将ExternalResult的items属性映射为List<MyItem> @Mapping(source = "items", target = ".") List<MyItem> externalResultToMyItems(ExternalResult externalResult); }
使用说明
- 因为设置了
componentModel = "spring",你可以直接通过@Autowired注入MyItemMapper实例使用:
@Service public class SomeService { @Autowired private MyItemMapper myItemMapper; public List<MyItem> processExternalResult(ExternalResult result) { return myItemMapper.externalResultToMyItems(result); } }
- 确保你的项目中正确引入了MapStruct 1.2.0.Final的依赖(以Maven为例):
<dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.2.0.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <!-- 根据你的JDK版本调整 --> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者dersvenhesse
相关产品推荐
相关产品推荐

