mapstruct的@AfterMapping注解失效问题

问题复现

@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生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值