我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。 该地图正常运行,现在我尝试将ExpertJpa列表转换为ExpertDto列表,然后添加第二个参数。
main()
在构建时,我收到错误消息,指出List是一个接口,不能是实例。...
错误:(53,18)java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。
答案 0 :(得分:0)
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(因此:它将仅在调用方法中设置,而本质上不属于映射源目标本身)。