问题复现
@Mapper
public interface ReqVo2AbilityVo {
ReqVo2AbilityVo INSTANCE = Mappers.getMapper(ReqVo2AbilityVo.class);
/**
* AddOrUpdateTmItemReqVo -》 InsertOrUpdateOtReqVo
*
* @param addOrUpdateTmItemReqVo
* @return
*/
InsertOrUpdateOtReqVo addTmItem2OtReqVo(AddOrUpdateTmItemReqVo addOrUpdateTmItemReqVo);
@AfterMapping
default void afterMapping(AddOrUpdateTmItemReqVo source, @MappingTarget InsertOrUpdateOtReqVo target) {
if (source != null && target != null) {
SimplifyTagResVo originalVo = Converter.element2SimpleStringConvert(source.getOriginalElement());
SimplifyTagResVo translationVo = Converter.element2SimpleStringConvert(source.getTranslationElement());
target.setOriginal(originalVo.getText());
target.setOriginalCompress(originalVo.getRes());
target.setTranslation(translationVo.getText());
target.setTranslationCompress(translationVo.getRes());
}
}
}
构建之后的实现类如下:
public InsertOrUpdateOtReqVo addTmItem2OtReqVo(AddOrUpdateTmItemReqVo addOrUpdateTmItemReqVo) {
if (addOrUpdateTmItemReqVo == null) {
return null;
} else {
InsertOrUpdateOtReqVo.InsertOrUpdateOtReqVoBuilder<?, ?> insertOrUpdateOtReqVo = InsertOrUpdateOtReqVo.builder();
insertOrUpdateOtReqVo.id(addOrUpdateTmItemReqVo.getId());
insertOrUpdateOtReqVo.original(addOrUpdateTmItemReqVo.getOriginal());
insertOrUpdateOtReqVo.translation(addOrUpdateTmItemReqVo.getTranslation());
insertOrUpdateOtReqVo.fileName(addOrUpdateTmItemReqVo.getFileName());
insertOrUpdateOtReqVo.isApproved(addOrUpdateTmItemReqVo.getIsApproved());
insertOrUpdateOtReqVo.lastOriginal(addOrUpdateTmItemReqVo.getLastOriginal());
insertOrUpdateOtReqVo.nextOriginal(addOrUpdateTmItemReqVo.getNextOriginal());
insertOrUpdateOtReqVo.note(addOrUpdateTmItemReqVo.getNote());
insertOrUpdateOtReqVo.remark(addOrUpdateTmItemReqVo.getRemark());
return insertOrUpdateOtReqVo.build();
}
}
可以看到上述实现类缺失afterMapping方法的调用,导致实体类转换未达到预期。
问题原因及解决方案
1. 与 Lombok 的 @Builder
注解冲突
- 现象: 若目标对象使用
@Builder
生成构造器,MapStruct 可能无法识别@AfterMapping
的后置处理方法。
- 解决方案:
- 调整
@AfterMapping
参数类型:将目标对象改为其Builder
构造器,并在方法中调用build()
。
- 调整
@AfterMapping
default void afterMapping(AddOrUpdateTmItemReqVo source, @MappingTarget InsertOrUpdateOtReqVo.InsertOrUpdateOtReqVoBuilder target) {
if (source != null && target != null) {
SimplifyTagResVo originalVo = Converter.element2SimpleStringConvert(source.getOriginalElement());
SimplifyTagResVo translationVo = Converter.element2SimpleStringConvert(source.getTranslationElement());
target.original(originalVo.getText()).originalCompress(originalVo.getRes())
.translation(translationVo.getText()).translationCompress(translationVo.getRes()).build();
}
}
使用上述方案处理后,发现@AfterMapping还是未失效。
2. 版本兼容性
- 使用 MapStruct ≥1.5.5 和 Lombok ≥1.18.30,避免注解处理器冲突
查看项目使用的版本发现,lombok和mapstruct版本均不符合要求。
- 解决方案:升级lombok和mapstruct版本。
经过上述调整后,@AfterMapping生效。