MapStruct qualifiedByName逆向配置编译报错,求原因与解决方法
MapStruct 对象转换逆向映射编译错误解决方案
错误原因
编译报错Unknown property "employee" in result type Employee.EmployeeBuilder. Did you mean "null"?,根源在于:
- 正向映射中使用
@Mapping(source = "employee", target = "fullName", qualifiedByName = "..."),显式指定source为整个Employee参数对象; - 逆向转换时使用
@InheritInverseConfiguration继承该配置,MapStruct会尝试将EmployeeDto的fullName映射到Employee的employee属性,但Employee类(包括@Builder生成的Builder类)不存在该属性; - 自定义的姓名拼接逻辑无法被MapStruct自动逆向解析,必须手动实现拆分逻辑。
修正后的代码
EmployeeMapper 接口
@Mapper public interface EmployeeMapper { // 正向转换:自动传递Employee对象给自定义拼接方法,无需指定source @Mapping(target = "fullName", qualifiedByName = "fullNameByFirstAndLastName") EmployeeDto toDto(Employee employee); // 逆向转换:手动配置映射规则,实现fullName拆分 @Mapping(target = "firstname", qualifiedByName = "extractFirstnameFromFullName") @Mapping(target = "lastname", qualifiedByName = "extractLastnameFromFullName") Employee fromDto(EmployeeDto dto); // 正向姓名拼接逻辑 @Named("fullNameByFirstAndLastName") default String fullNameByFirstAndLastName(Employee employee) { return employee.getFirstname() + "-" + employee.getLastname(); } // 逆向拆分名字逻辑 @Named("extractFirstnameFromFullName") default String extractFirstnameFromFullName(EmployeeDto dto) { String fullName = dto.getFullName(); if (fullName == null || !fullName.contains("-")) { return ""; // 可根据业务需求调整空值处理逻辑 } return fullName.split("-")[0]; } // 逆向拆分姓氏逻辑 @Named("extractLastnameFromFullName") default String extractLastnameFromFullName(EmployeeDto dto) { String fullName = dto.getFullName(); if (fullName == null || !fullName.contains("-")) { return ""; // 可根据业务需求调整空值处理逻辑 } return fullName.split("-")[1]; } }
实体类保持不变
@Data @Builder public class Employee { private int id; private String firstname; private String lastname; } @Data public class EmployeeDto { private int id; private String fullName; // FirstName+ '-' +lastName }
关键修正点
- 移除正向映射中的
source = "employee":MapStruct会自动将方法参数(Employee对象)传递给标注了@Named的自定义转换方法,无需显式指定; - 放弃使用
@InheritInverseConfiguration:自定义的拼接逻辑无法被自动逆向,必须手动配置逆向映射规则并实现拆分方法; - 新增逆向拆分方法:针对fullName格式实现名字和姓氏的拆分,同时处理空值和格式异常的情况,避免运行时错误。
内容的提问来源于stack exchange,提问作者Hassen Ben Slima
相关产品推荐
相关产品推荐

