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
相关产品推荐
相关产品推荐

