Mapstruct中@AfterMapping带参数实现mapToMetas执行问题求助
解决思路
1. 用MapStruct的@AfterMapping实现后置触发
这是最贴合MapStruct设计的方案,能直接在映射方法执行完成后自动触发自定义逻辑:
@Mapping(target = "auditoriaMetas", ignore = true) // 先忽略该字段的自动映射 public abstract Auditoria mapToModificacio(QdCF qdcf, QdCFPresenter qdcfPresenter, Integer idInstrument); @AfterMapping protected void afterMapToModificacio(QdCF qdcf, QdCFPresenter qdcfPresenter, @MappingTarget Auditoria auditoria) { // 手动调用mapToMetas并将结果赋值给目标对象的字段 auditoria.setAuditoriaMetas(mapToMetas(qdcf, qdcfPresenter)); } @Named("sdf") public List<AuditoriaMeta> mapToMetas(QdCF current, QdCFPresenter incoming) { // 替换为你的实际业务逻辑,不要返回null return new ArrayList<>(); }
@AfterMapping标记的方法会在mapToModificacio的基础映射逻辑执行完毕后自动调用@MappingTarget用于获取已经完成基础映射的Auditoria实例,你可以在这里补充字段赋值或执行其他后置操作
2. 手动封装调用流程
如果不想依赖MapStruct的注解,也可以通过默认方法封装完整调用逻辑:
@Mapping(target = "auditoriaMetas", ignore = true) public abstract Auditoria mapToModificacioBase(QdCF qdcf, QdCFPresenter qdcfPresenter, Integer idInstrument); default Auditoria mapToModificacio(QdCF qdcf, QdCFPresenter qdcfPresenter, Integer idInstrument) { // 先执行基础映射 Auditoria auditoria = mapToModificacioBase(qdcf, qdcfPresenter, idInstrument); // 再调用mapToMetas并处理结果 auditoria.setAuditoriaMetas(mapToMetas(qdcf, qdcfPresenter)); return auditoria; } @Named("sdf") public List<AuditoriaMeta> mapToMetas(QdCF current, QdCFPresenter incoming) { // 替换为你的实际业务逻辑 return new ArrayList<>(); }
- 将原映射方法改名为
mapToModificacioBase作为基础映射入口 - 新增默认方法
mapToModificacio,按顺序执行基础映射和mapToMetas调用
3. 原代码问题说明
你原来的@Mapping(target = "auditoriaMetas", qualifiedByName = "sdf")作用是把auditoriaMetas字段的值设置为mapToMetas的返回值,并非在mapToModificacio执行后触发方法调用。如果该逻辑未生效,大概率是参数匹配问题:
mapToModificacio有三个参数,而mapToMetas只有两个,MapStruct需要明确参数传递规则- 若要保留字段映射方式,可通过
@Context标记不需要映射的参数来匹配:
@Mapping(target = "auditoriaMetas", qualifiedByName = "sdf") public abstract Auditoria mapToModificacio(QdCF qdcf, @Context QdCFPresenter qdcfPresenter, Integer idInstrument); @Named("sdf") public List<AuditoriaMeta> mapToMetas(QdCF current, @Context QdCFPresenter incoming) { // 业务逻辑实现 return new ArrayList<>(); }
但这种方式本质还是字段赋值,不是方法执行后的触发操作。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

