首页 > 解决方案 > 如何从具有对象列表和一个对象列表的模型实体映射到具有 Mapstruct 的单个域实体

问题描述

如何使用MapStruct创建一个映射器,该映射器从包含一个对象列表和一个对象列表的模型实体映射到域实体,仅包含嵌套对象列表。

我的模型实体列表对象 = SourceObject-A;

我的模型实体第二个对象 = SourceObject-B;

我的域实体列表对象 = TargetObject-AB;

我的源类如下所示:

源对象-A:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {

  private int id;
  private String name;

  }

源对象-B:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class CountryDetails {

    private String country;
    private String countryCode;

}

所以我需要把它转换成这个(TargetObject-AB):

@NoArgsConstructor
@AllArgsConstructor
@Data
public class DomainUser {
    private int id;
    private String name;
    private String country;
    private String countryCode;
}

用户控制器:

GetMapping("/users")
public List<DomainUser> getDUsers(List<User> usersList, CountryDetails countryDetails){

     List<DomainUser> domainUsersList=ModelToDomainMapper.INSTANCE.UserToDUser(usersList, 
     countryDetails);


  return domainUsersList;

}

映射器接口:

@Mapper
public interface ModelToDomainMapper {

    ModelToDomainMapper INSTANCE = Mappers.getMapper(ModelToDomainMapper.class)


    List<DomainUser> UserToDUser(List<User> users, CountryDetails countryDetails);


}

预期的样本 json:

源(输入):

[
        
  "countryDetails":{
        
                 "country"     : "India",
                 "countryCode" : "+91"
           
                  },
  "userslist" :[
        
            {
        
                "id"   : 1,
                "name" : "XXXXXXX"
           
              },
            {
        
               "id"   : 2,
               "name" : "XXXXXXX"
           
             }
        ]
    ]

目标(预期输出):

[
  {
    "id": 1,
    "name": "xxxxxx",
    "country": "India",
    "countryCode": "+91"
  },
  {
    "id": 2,
    "name": "xxxxxx",
    "country": "India",
    "countryCode": "+91"
  }
]

有什么办法可以得到上面的输出,请帮助我。

标签: javaspring-bootmapstruct

解决方案


你可以在你的映射器中做这样的事情:

    DomainUser UserToDUser(User user, CountryDetails countryDetails);

    default List<DomainUser> UsersToDomainUsers(List<User> users, CountryDetails countryDetails) {
        return users.stream()
                .map((user -> UserToDUser(user, countryDetails)))
                .collect(Collectors.toList());
    }

这将使用 MapStruct 生成的映射器将每一个User与相同的映射器合并CountryDetails以创建一个DomainUser并将它们全部收集到一个List使用流中。


推荐阅读