首页 > 解决方案 > 将 List 转换为具有多个参数的另一个 List

问题描述

我有 2 个对象 ExpertJpa 到 ExpertDto 的现有映射,需要另一个参数来过滤 ExpertJpa。这张地图工作正常,现在我尝试将 ExpertJpa 列表转换为 ExpertDto 列表,我添加了第二个参数。

@Mappings({
        @Mapping(target = "status", ignore = true),
        @Mapping(target = "profile", source = "input.expertProfile"),
        @Mapping(target = "engagementId", expression = "java(new MapperHelper().ReturnExpertEngagementIdByApiKey(input,identity))"),
        @Mapping(target = "campaignId", expression = "java(new MapperHelper().ReturnExpertCampaignIdByApiKey(input,identity))"),

})
Expert ExpertJpaToExpert(com.consumer.expert.dbaccessor.entities.Expert input, Identity identity);

List<Expert> ListExpertsJpaToListExperts(List<com.consumer.expert.dbaccessor.entities.Expert> input, Identity identity);

在构建时,我收到错误消息 List 是一个接口并且不能是实例....

错误:(53, 18) java: 返回类型 java.util.List 是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。

标签: mapstruct

解决方案


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(因此:它只会在调用方法中设置,但本质上不是映射源-目标本身的一部分)。


推荐阅读