在我们的项目中,我们有多个模块,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 造成的错误/限制,还是我做错了什么?