【问题标题】:@Mapping on mapstruct with List<> Of List<>使用 List<> 的 List<> 在 mapstruct 上进行 @Mapping
【发布时间】:2021-08-26 11:26:27
【问题描述】:

我最近开始使用 mapstruct,在编码时我遇到了一个场景。为了解决以下默认方法之间的歧义,我尝试在列表中使用“qualifiedBy”

@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 行显示错误,因为它需要指定“目标”。我不确定这里的目标应该是什么,因为 Line 是一个集合对象。即使我不使用@mapping,mapstuct 也会生成映射器实现。我阅读了 mapstuct 文档,但对这种情况没有太多了解。如何在 List 上使用 Named 注释来明确表示这是要使用的名称?有人能帮我吗?谢谢。

【问题讨论】:

    标签: mapstruct


    【解决方案1】:

    必须指定目标,所以如果你的 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;
       }
    }
    

    【讨论】:

    • A 到 A(B b); - 我试图理解,那么 A 和 B 在这里表示实际的类名是什么?实际上我尝试在一个类中调用 toCaptureLineItemsBOs 是 MapperInterfaceName。 toCaptureLineItemsBOs()。我需要了解什么以及如何对其进行重构?我只是在尝试其他选项,只是在上面的默认方法上应用了@Named 注释()@Named(“LineTestBO”)默认 ReturnABO 映射(它工作正常没有问题。但是映射器没有使用命名方法生成器。
    • 谢谢bbahaida。当我尝试实现您的想法时, List 和 List
    【解决方案2】:

    错误的原因是在可迭代映射方法上使用@Mapping没有多大意义。

    你要找的是IterableMapping#qualifiedBy

    所以在你的情况下,映射器需要看起来像:

    @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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多