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

@在mapstruct上映射列表

轩辕欣可
2023-03-14

我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决下面默认方法之间的模糊性,我试图在列表中使用“限定由”

@Mapping(qualifiedBy = LineTestBO). Line => 1
 List<ReturnABO> toCaptureLineItemsBOs(List<LineDTO> lineDTO);

 @Named("LineTestBO")
 default ReturnABO map(LineDTO lineDTO) {
     if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null &&
         lineDTO.getAmount() != null && lineDTO != null)
         return this.toBO(lineDTO);
     return null;
 }

  default returnABO toBO(LineDTO lineDTO)  {
  // To do here
}

但是第1行显示错误,因为需要指定“target”。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping,mapstuct也会生成mapper实现。我阅读了mapstuct文档,但对这个场景了解不多。如何在列表上使用命名注释来明确表示这是要使用的名称?有人能帮我吗?谢谢

共有2个答案

唐永春
2023-03-14

产生错误的原因是在iterable映射方法上使用@Mapping没有多大意义。

你要找的是IterableMapping#合格的

因此,在您的情况下,映射器需要如下所示:

@Mapper
public interface MyMapper {

    @IterableMapping(qualifiedByName = "LineTestBO")
    List<ReturnABO> toCaptureLineItemsBOs(List<LineDTO> lineDTO);

    @Named("LineTestBO")
    default ReturnABO map(LineDTO lineDTO) {
        if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null && lineDTO.getAmount() != null && lineDTO != null) {
            return this.toBO(lineDTO);
        }
        
        return null;
     }

    default returnABO toBO(LineDTO lineDTO)  {
         // To do here
    }
}
邹学民
2023-03-14

必须指定目标,所以如果你的POJO看起来像这样

class A {
  private List<ReturnABO> x;
}

class B {
  private List<LineDTO> x;
}

在你的映射器中,你可以有这样的东西

interface AMapper {
   @Mapping(target="x", source="x", qualifiedByName = "LineTestBO")
   A toA(B b);

   @Named("LineTestBO")
   default List<ReturnABO> lineTestBO (List<LineDTO> lines) {
      return lines.stream().map(this::map).collect(Collectors.toList())
   } 
   default ReturnABO map(LineDTO lineDTO) {
      if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null &&
           lineDTO.getAmount() != null && lineDTO != null)
           return this.toBO(lineDTO);
      return null;
   }
}
 类似资料:
  • 如何将字符串映射到列表,并将列表映射到字符串? 考虑到我们有以下班级 在Dozer和Orika中,我们可以使用以下代码行轻松映射 如何在MapStruct中进行相同类型的映射?在哪里可以找到有关mapstruct的更多示例?

  • 下面是我的DTO。 源DTO 目标DTO

  • 我是Mapstruct的新手。我试图将列表转换为地图,我在网上搜索了很多,我有一些解决方案,比如它还没有在mapstruct中实现。如果有人能提供一些替代解决方案,我将很高兴。所有我希望转换映射如下: 现在是否可以使用MapStruct来实现?

  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 我如何在下面的场景中使用Mapstruct进行bean映射。 现在我想把sourceId映射到targetId,courseName映射到subjectName,studentName映射到memberName(list到list)。

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->