多个命名的 MapStruct `AfterMappings` 没有被调用

Multiple named MapStruct `AfterMappings` are not getting called

我在尝试使用相同目标的两个 AfterMappings 时遇到问题。我已经尝试使用 @Qualifier@Named 方法以及 @BeanMapping 但没有成功:不会调用映射后。

这是一个代码片段:

@Mapper(componentModel = "spring")
public abstract class NotificationMapper {
    // ... autowired services

    // ... several @Mappings
    public abstract IssueNotificationResponse notificationToIssueResponse(Notification notification);
    
    @BeanMapping(qualifiedByName = "descOrder")
    public abstract List<IssueNotificationResponse> notificationsToIssueResponsesDesc(List<Notification> notifications);
    
    @BeanMapping(qualifiedByName = "ascOrder")
    public abstract List<IssueNotificationResponse> notificationsToIssueResponsesAsc(List<Notification> notifications);

    @Named("descOrder")
    @AfterMapping
    public void afterMappingOrderDesc(@MappingTarget List<IssueNotificationResponse> target) {
        // ... sort target in desc order
    }

    @Named("ascOrder")
    @AfterMapping
    public void afterMappingOrderAsc(@MappingTarget List<IssueNotificationResponse> target) {
        // ... sort target in asc order
    }
}

我不知道如何用 @BeanMapping@Named 解决。

但是,我可以建议使用其他解决方案来完成此操作,使用两个不同的 @Context 您将与 Mapstruct 一起使用:

  • ContextDesc
  • ContextAsc

第一个示例:

public class ContextDesc {

    public ContextDesc() {
    }

    @AfterMapping
    public void establishRelation(@MappingTarget List<IssueNotificationResponse> issueNotificationResponse)
    {
        ...
    }
}

并将它们与您的

一起使用
  • notificationsToIssueResponsesDesc(List<Notification> notifications, @Context ContextDesc ctx)
  • notificationsToIssueResponsesAsc(List<Notification> notifications, @Context ContextAsc ctx)

更新:随着

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class TmpMapper {

    @BeanMapping(qualifiedByName = "descOrder")
    public abstract IssueNotificationResponse notificationsToIssueResponsesDesc(Notification notifications);

    @BeanMapping(qualifiedByName = "ascOrder")
    public abstract IssueNotificationResponse notificationsToIssueResponsesAsc(Notification notifications);

    @Named("descOrder")
    @AfterMapping
    public IssueNotificationResponse afterMappingOrderDesc(@MappingTarget IssueNotificationResponse res, Notification notifications) {
        // ... sort target in desc order
        return res;
    }

    @Named("ascOrder")
    @AfterMapping
    public IssueNotificationResponse afterMappingOrderAsc(@MappingTarget IssueNotificationResponse res, Notification notifications) {
        // ... sort target in asc order
        return res;
    }
}

您生成了 @AfterMapping,但这不是您想要的,因为参数中没有 List。 Mapstruct 不处理 @AfterMapping@NamedCollections 或者我没有找到解决它的方法。你可以用这个例子检查一下

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class NotificationMapper {

    @BeanMapping(qualifiedByName = "descOrder")
    public abstract List<IssueNotificationResponse> notificationsToIssueResponsesDesc(List<Notification> notifications);

    @Named("descOrder")
    @AfterMapping
    public List<IssueNotificationResponse> afterMappingOrderDesc(@MappingTarget List<IssueNotificationResponse> res, List<Notification> notifications) {
        // ... sort target in desc order
        return res;
    }

    @Named("descOrder")
    @AfterMapping
    public IssueNotificationResponse afterMappingOrderDesc(@MappingTarget IssueNotificationResponse res, Notification notifications) {
        // ... sort target in desc order
        return res;
    }
}

您会看到只有 afterMappingOrderDesc(IssueNotificationResponse res, Notification notifications) 方法被生成和使用。 List一个没用