MapStruct может сделать это автоматически для вас. Однако он не может обрабатывать методы с несколькими аргументами (в принципе он сопоставляет источник с целью).
Сказав это, если немного переписать свой код, вы можете избавиться от выражения и получить полное типовое безопасное решение.
Итак:
class IdentityContext {
private final Identity id;
private final MapperHelper mapperHelper;
public IdentityContext(Identity id){
this.id = id;
this.mapperHelper = new MapperHelper();
}
@AfterMapping
public void setIds(com.consumer.expert.dbaccessor.entities.Expert input, @MappingTarget Expert expertOut) {
expertOut.setEngagementId( mapperHelper.ReturnExpertEngagementIdByApiKey(input,identity) );
expertOut.setCampaignId( mapperHelper. ReturnExpertCampaignIdByApiKey(input,identity) );
}
}
теперь определите ваш маппер так:
@Mappings({
@Mapping(target = "status", ignore = true),
@Mapping(target = "profile", source = "input.expertProfile")
})
Expert ExpertJpaToExpert(com.consumer.expert.dbaccessor.entities.Expert input, @Context IdentityContext ctx);
List<Expert> ListExpertsJpaToListExperts(List<com.consumer.expert.dbaccessor.entities.Expert> input, @Context IdentityContext ctx)
Примечание: MapStruct теперь распознает отображение списка, потому что IdentityContext помечен как @Context (поэтому: он будет установлен только в вызывающем методе, но по сути не будет частью самой цели-источника отображения).