MapStruct如何自动将嵌套对象属性映射至目标对象对应属性?
问题:MapStruct能否自动映射嵌套对象的所有属性?
假设我们有以下类定义:
class Person { String firstName; String lastName; } class PersonBLO { Person person; Integer foo; // 计算得出的业务属性 } class PersonDTO { String firstName; String lastName; Integer foo; }
目前我写的映射器是这样的:
@Mapping(target = "firstName", source = "person.firstName") @Mapping(target = "lastName", source = "person.lastName") PersonDTO personBLOToPersonDTO(PersonBLO personBLO);
请问有没有办法自动把所有person.*属性映射到对应的*属性上,不用逐个写@Mapping?
当然可以!
MapStruct专门提供了简洁的语法来处理这种嵌套对象的批量映射,完全不用手动逐个声明属性映射。
你只需要用@Mapping指定嵌套对象作为源,同时把target设为.(代表目标对象本身),MapStruct就会自动匹配嵌套对象和目标对象的同名属性:
@Mapping(target = ".", source = "person") PersonDTO personBLOToPersonDTO(PersonBLO personBLO);
这样一来:
Person里的firstName和lastName会自动映射到PersonDTO的对应属性PersonBLO里的foo属性因为和PersonDTO的foo同名,也会被自动映射,不需要额外配置
如果之后遇到个别属性名不匹配的情况,只需要在这个基础上额外加单独的@Mapping就行,比如:
@Mapping(target = ".", source = "person") @Mapping(target = "fullName", source = "person.fullNameInPerson") // 示例:属性名不同的特殊情况 PersonDTO personBLOToPersonDTO(PersonBLO personBLO);
另外要注意,这种语法在MapStruct 1.3及以上版本都支持,确保你的项目依赖的是合适的版本,并且编译时正确配置了MapStruct的注解处理器,这样才能生成正确的映射实现代码。
内容的提问来源于stack exchange,提问作者JIN
相关产品推荐
相关产品推荐

