多个命名的 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
和 @Named
与 Collections
或者我没有找到解决它的方法。你可以用这个例子检查一下
@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
一个没用
我在尝试使用相同目标的两个 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
和 @Named
与 Collections
或者我没有找到解决它的方法。你可以用这个例子检查一下
@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
一个没用