当前位置: 首页 > 知识库问答 >
问题:

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

秦学林
2023-03-14

如何使用MapSTRt创建映射器,从模型实体,包括一个对象列表和另一个对象到域实体,只包括嵌套对象的列表。

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

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

我的Doamin实体列表对象=目标对象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"
  }
]

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

共有1个答案

李疏珂
2023-03-14

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

    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());
    }

这将使用MapSTRt生成的映射器将每一个User与相同的Country细节合并,以创建一个DomainUser,并使用流将它们收集到一个List中。

 类似资料:
  • 假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?

  • 我是MapStruct的新手,我试图映射目标类中的对象列表,其中as源具有包括其他字符串变量在内的单个值。自定义实现也没有运气。请执行的任何建议

  • 尝试使用mapstruct将两个列表映射到另一个列表时遇到问题。结构如下: 我需要将来自类C和类B的列表映射到类A中的列表(从对象B和对象C到对象A的映射已经完成)。我尝试了以下方法: 这给我带来了编译错误。有人能帮我映射这些列表吗?我听说过一个名为异常的注释参数,但无法解决我的问题。 谢谢

  • 我有Object1和Object2。现在,我想映射对象3,属性来自1 比方说,我有两个目标: 现在,有了这些,我想把它映射进去 哪里,first_name 现在,我的问题是,怎么做? 然而,目前,我正在这样做 但是,在这里,我必须在addressToView()中手动编写映射。 因此,有没有办法避免这种情况? 或者,处理此类情况的首选方式是什么?

  • 我有2个微服务:我们称它们为A和B。 由B处理的实体(其中引用了a的实体)被实现为简单的长id(例如groupId) 我想要实现的是使用mapstruct填充B(由A持有)的缺失组数据。到目前为止,我尝试使用@AfterMapping函数向a请求缺失的数据。我的映射器是: 给我映射功能的实现接口是: 生成的代码的问题在于,将实体列表映射到DTO列表的函数对每个实体使用EntityToToTo,导致