mapstruct - 将 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 可以自动为您执行此操作。但是它不能处理多个参数方法(原则上它将源映射到目标)。
话虽如此,如果您稍微重写一下代码,您就可以摆脱表达式并获得完整的类型安全解决方案。
所以:
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(因此:它只会在调用方法中设置,但本质上不是映射源-目标本身的一部分)。
推荐阅读
- javascript - 创建新块 + 复制时不可变/Draftjs 错误“block.getKey 不是函数”
- visual-studio-code - 在 Linux 发行版上以非 root 用户身份安装 VSCode?
- git - git lfs push 很慢
- typescript - setCollideWorldBounds 和重叠 Phaser 3 的问题
- c++ - bugs 程序收到信号 sigsegv,分段错误
- regex - linux bash shell:搜索包含部分已知单词序列的文件
- swiftui - 为什么 Swiftui 中主线程不按顺序排列
- ios - 在 Firestore 文档中的字典中增加多个值
- vba - VBA Selenium 从下拉菜单中选择一个值
- excel - Excel 工作簿打开时如何自动显示 VBA 用户窗体?