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;
    }
}