在我们的项目中,我们有多个模块,其中 OpenAPI 规范是生成类的来源,代表各种版本的域模型。现在,使用 MapStruct(版本 1.6.2),我正在创建映射器,用于在属于不同模块的相同域类之间进行转换。
这是我的映射器类:
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface AccountMapper {
@Mapping(source = "account", target = "depositAccount")
com.model5.AccountWithDetailsOneOf map(com.model6.DepositAccount account);
}
代码编译会产生此警告
java: Unmapped target property: "email". Mapping from Collection element "AccountHolder account.contact.holders" to "AccountHolder depositAccount.contact.holders".
问题是,在版本 6(这是我的源代码)中,罪魁祸首字段称为
emails
,而在版本 5(这是目标)中,相应字段的名称是 email
。
为了解决这个问题,我将
map()
方法修改为:
@Mapping(source = "account", target = "depositAccount")
@Mapping(source = "account.contact.holders.emails", target = "depositAccount.contact.holders.email")
com.model5.AccountWithDetailsOneOf map(com.model6.DepositAccount account);
重新编译失败后
java: The type of parameter "account" has no property named "contact.holders.emails".
但是该属性确实存在,唯一的问题是它是超类的成员(见下面的屏幕截图)。我怀疑这在某种程度上破坏了映射,但我不清楚原因,因为所有必需的 getter 和 setter 都是用 Lombok 生成的,并通过整个引用链出现在目标类中。
这是 MapStruct 强加的错误/限制还是我做错了什么?
您需要添加另一个映射
@Mapping(source = "emails", target = "email")
X mapYtoX(Y y);
哪里
X
是 depositAccount.contact.holders
Y
是 account.contact.holders