如何使用 Mapstruct 从具有对象列表和一个对象列表的模型实体映射到单个域实体

How to map from Model entity with list of Objects and one more Object to single Domain entity with Mapstruct

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

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

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

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

我的来源 类 看起来像这样:

SourceObject-A:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {

  private int id;
  private String name;

  }

SourceObject-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"
  }
]

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

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

    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 .