Java 具有多个源的MapStruct映射器
假设我需要将两个对象映射到一个或一个对象映射到一个(重载)。我可以通过以下映射来实现这一点:Java 具有多个源的MapStruct映射器,java,mapstruct,Java,Mapstruct,假设我需要将两个对象映射到一个或一个对象映射到一个(重载)。我可以通过以下映射来实现这一点: @Mapper 公共接口ThingMapper { @映射( { @映射(source=“createdDateTime”,target=“thingDate”), @映射(source=“approver.id”,target=“approverId”), }) 事物从一个事物到另一个事物; //TODO这是多余的,如何清理? @映射( { //因为有两个参数,所以需要将相同的命名参数从源“thing
@Mapper
公共接口ThingMapper
{
@映射(
{
@映射(source=“createdDateTime”,target=“thingDate”),
@映射(source=“approver.id”,target=“approverId”),
})
事物从一个事物到另一个事物;
//TODO这是多余的,如何清理?
@映射(
{
//因为有两个参数,所以需要将相同的命名参数从源“thing”映射到目标
@映射(source=“thing.id”,target=“id”),
@映射(source=“thing.deletedDateTime”,target=“deletedDateTime”),
@映射(source=“thing.version”,target=“version”),
@映射(source=“thing.autoApproved”,target=“autoApproved”),
@映射(source=“thing.resolvedDate”,target=“resolvedDate”),
@映射(source=“thing.status”,target=“status”),
//许多其他字段从源“thing”映射到具有相同属性名称的目标
//映射不同名称的参数(与上面的其他映射器重复)
@映射(source=“thing.createdDateTime”,target=“thingDate”),
@映射(source=“thing.approver.id”,target=“approverId”),
//将第二个参数“owner”目录映射到目标“owner”属性
@映射(source=“owner”,target=“owner”),
})
ThingEventPayload到EventPayload(ThingThing,用户所有者);
}
请注意,默认情况下,第一个映射器将所有字段从源映射到目标(大多数字段名称匹配),但有两个从源映射到不同名称的目标字段的特定映射
第二个映射器希望像第一个映射器一样,将所有对象映射到根目标,但随后将第二个参数owner
另外映射到目标的同名owner
字段
是否有方法更改第二个映射器“首先执行第一个映射器”,然后应用@mapping(source=“owner”,target=“owner”)
?在这种情况下,您可以使用自定义方法
比如说
@Mapper
public interface ThingMapper {
@Mappings(
{
@Mapping(source = "createdDateTime", target = "thingDate"),
@Mapping(source = "approver.id", target = "approverId"),
})
ThingEventPayload toEventPayload(Thing thing);
UserPayload toUserPayload(User user);
default ThingEventPayload toEventPayload(Thing thing, User owner) {
ThingEventPayload eventPayload = toEventPayload(thing);
if (eventPayload != null) {
eventPayload.setOwner(toUserPayload(owner));
}
return eventPayload;
}
}