代码之家  ›  专栏  ›  技术社区  ›  Bevor

mapStruct:将列表映射到其他列表?

  •  8
  • Bevor  · 技术社区  · 8 年前

    我有一份清单 List<Payment> List<PaymentPlan> . 这些类型如下所示:

    public class Payment {
    
        @XmlElement(name = "Installment")
        @JsonProperty("Installment")
        private List<Installment> installments = new ArrayList<>();
    
        @XmlElement(name = "OriginalAmount")
        @JsonProperty("OriginalAmount")
        private BigDecimal originalAmount;
    
    //getters setters, more attributes
    }
    

    public class PaymentPlan {
        //(Installment in different package)
        private List<Installment> installments;
    
        @XmlElement(name = "OriginalAmount")
        @JsonProperty("OriginalAmount")
        private BigDecimal originalAmount;
    
    //getters setters, more attributes
    }
    

    我希望这样的事情能奏效。。。

    @Mappings({
        @Mapping(//other mappings...),
        @Mapping(source = "payments", target = "paymentInformation.paymentPlans")
    })
    ResultResponse originalResponseToResultResponse(OrigResponse originalResponse);
    

    ...但我得到:

    Can't map property java.util.List<Payment> to java.util.List<PaymentPlan>.
    Consider to declare/implement a mapping method java.util.List<PaymentPlan> map(java.util.List<Payment> value);
    

    我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),因此MapStruct知道如何映射列表类型的每个字段,如下所示:

    @Mappings({
      @Mapping(source = "payment.originalAmount", target = "paymentInformation.paymentPlan.originalAmount")
    })
    List<PaymentPlan> paymentToPaymentPlan(List<Payment> payment);
    

    ...但我收到的错误消息如下

    The type of parameter "payment" has no property named "originalAmount".
    

    显然,我做了一些完全错误的事情,因为听起来它甚至无法识别列表的类型。

    @Mapping(target = "paymentPlans",expression="java(Helper.mapManually(payments))")

    1 回复  |  直到 8 年前
        1
  •  6
  •   Filip    8 年前

    1.1.0.Final . 您的额外映射是正确的,唯一的区别是您需要定义一个没有列表的映射,MapStruct将使用该映射来进行映射(示例消息对集合有点误导)。

    PaymentPlan paymentToPaymentPlan(Payment payment);
    

    你甚至不需要 @Mappings 因为它们将自动映射。您可能还需要为 Instalment (因为它们在不同的包中)。

    如果切换到1.2.0。然后MapStruct可以自动为您生成方法。