我想使用 Mapstruct 从两个源对象构建一个内部有嵌套对象的目标对象,并同时使用 Lombok。映射的描述是:
目标:
class Kpi {
String name;
KpiMeta meta;
}
为了构建此类,我使用两个源对象:
JmsMessageKpiDto
和KpiDto
。
我定义了第一个映射器,它采用相同的两个源对象并创建一个
KpiMeta
目标,然后我创建了第二个映射器,它声明使用第一个映射器来构建最终的Kpi
对象:
@Mapper(uses = KpiMetaMapper.class)
interface KpiMapper {
KpiMapper INSTANCE = Mappers.getMapper(KpiMapper.class);
Kpi toKpi(JmsMessageKpiDto jms, KpiDto dto);
}
对于我的两个目标对象(Kpi 和 KpiMeta),我想使用 Lombok 中的
@Builder
。但最终,在生成的代码中,字段 KpiMeta
并未填充到 Kpi
对象内。
有什么解决方案可以让它工作吗?
您只需要一个映射器即可从多个来源获取目标对象。
例如,让有一个物体
public class Person {
private Long id;
public String name;
}
和物体
public class Message {
private String number;
private String series;
}
然后创建一个对象
public class Citizen {
private Passport passport;
private String name;
}
带有嵌套对象
public class Passport {
private String number;
private String series;
}
你只需要编写这样一个映射器
@Mapper
public interface CitizenMapper {
@Mapping(source = "person.name", target = "name")
@Mapping(source = "message.number", target = "passport.number")
@Mapping(source = "message.series", target = "passport.series")
Citizen createCitizen(Person person, Message message);
}
将自动创建嵌套的 Passport 对象。
有关更多信息,请参阅 MapStruct 参考指南。