mapStruct:将列表映射到其他列表?
mapStruct: map list to other list?
我有一个列表 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);
我不知道如何应用这些信息。首先,虽然我需要为列表声明一些额外的映射(在同一个映射器 class 中),因此 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))")
但我想 MapStruct 可以自己处理这个问题。
我假设您使用的是 1.1.0.Final
版本。您的额外映射是正确的,唯一的区别是您需要定义一个没有列表的映射,然后 MapStruct 将使用它来进行映射(示例消息对集合有点误导)。
PaymentPlan paymentToPaymentPlan(Payment payment);
您甚至不需要 @Mappings
,因为它们会自动映射。您可能还需要为 Instalment
定义方法(因为它们在不同的包中)。
如果您切换到 1.2.0.CR2,则 MapStruct 可以自动为您生成方法。
我有一个列表 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);
我不知道如何应用这些信息。首先,虽然我需要为列表声明一些额外的映射(在同一个映射器 class 中),因此 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))")
但我想 MapStruct 可以自己处理这个问题。
我假设您使用的是 1.1.0.Final
版本。您的额外映射是正确的,唯一的区别是您需要定义一个没有列表的映射,然后 MapStruct 将使用它来进行映射(示例消息对集合有点误导)。
PaymentPlan paymentToPaymentPlan(Payment payment);
您甚至不需要 @Mappings
,因为它们会自动映射。您可能还需要为 Instalment
定义方法(因为它们在不同的包中)。
如果您切换到 1.2.0.CR2,则 MapStruct 可以自动为您生成方法。