You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8下Mapstruct 1.4实现目标类Office内部属性映射的方案咨询

完全可以通过MapStruct原生能力实现,先说明你报错的根本原因:你在单个@Mapping注解中重复定义了target属性,这属于语法错误,且MapStruct默认不支持直接将目标类已映射属性作为另一个目标属性的映射源,按以下两种方案实现即可:

方案1:使用@AfterMapping(更直观,推荐)

在映射逻辑执行完成后,直接操作已经赋值完毕的目标对象生成phoneNumberWithcode,完整Mapper示例:

@Mapper
public interface OfficeMapper {
    OfficeMapper INSTANCE = Mappers.getMapper(OfficeMapper.class);

    @Mappings({
        @Mapping(target = "phone", source = "address", qualifiedByName = "getPhoneFromAddress"),
        @Mapping(target = "department", source = "department")
        // 其余字段按需补充映射规则
    })
    Office getOfficeFromDepartment(Department dept);

    // 映射完成后自动执行该方法
    @AfterMapping
    default void handlePhoneWithCode(@MappingTarget Office office) {
        if (office.getPhone() == null) {
            return;
        }
        office.setPhoneNumberWithcode(convertPhoneToPhoneWithCode(office.getPhone()));
    }

    @Named("getPhoneFromAddress")
    default String getPhoneFromAddress(String address) {
        // 原有从Address提取手机号的逻辑
    }

    default String convertPhoneToPhoneWithCode(String phone) {
        // 原有手机号加区号的逻辑
    }
}

方案2:链式调用自定义转换器

如果不想加后置处理方法,也可以直接给phoneNumberWithcode配置链式的转换规则,两次复用转换逻辑:

@Mapper
public interface OfficeMapper {
    OfficeMapper INSTANCE = Mappers.getMapper(OfficeMapper.class);

    @Mappings({
        @Mapping(target = "phone", source = "address", qualifiedByName = "getPhoneFromAddress"),
        // 配置两个转换规则按顺序执行:先提取手机号,再加工为带区号的格式
        @Mapping(target = "phoneNumberWithcode", source = "address", qualifiedByName = {"getPhoneFromAddress", "convertPhoneToPhoneWithCode"}),
        @Mapping(target = "department", source = "department")
    })
    Office getOfficeFromDepartment(Department dept);

    @Named("getPhoneFromAddress")
    default String getPhoneFromAddress(String address) {
        // 原有从Address提取手机号的逻辑
    }

    @Named("convertPhoneToPhoneWithCode")
    default String convertPhoneToPhoneWithCode(String phone) {
        // 原有手机号加区号的逻辑
    }
}

注意:如果你的Department类的地址属性名确实是大写开头的Address,把上方代码中source = "address"改成source = "Address"即可。

内容的提问来源于stack exchange,提问作者Jeya Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:42:03