MapStruct中BeanMapping忽略默认配置对子类属性不生效问题咨询
MapStruct 子类映射忽略默认属性的解决方案
问题出在MapStruct的@SubclassMapping自动生成的子类映射方法不会继承父类映射方法上的@BeanMapping(ignoreByDefault = true)配置,默认会自动匹配子类的同名属性,导致你设置的忽略默认映射规则对子类属性无效。
以下是两种无需逐个显式映射子类的优化解决方法:
方案一:全局配置忽略默认映射
通过@MapperConfig定义全局映射规则,让所有映射方法默认启用ignoreByDefault,无需在每个方法上重复配置:
@MapperConfig(beanMapping = @BeanMapping(ignoreByDefault = true)) public interface UserMapperConfig { }
修改UserMapper,引入该全局配置:
@Mapper( subclassExhaustiveStrategy = SubclassExhaustiveStrategy.RUNTIME_EXCEPTION, config = UserMapperConfig.class ) public abstract class UserMapper { @Mapping(source = "id", target = "id") @Mapping(source = "firstName", target = "firstName") @Mapping(source = "lastName", target = "lastName") @SubclassMapping(source = Employee.class, target = EmployeeDTO.class) @SubclassMapping(source = Contractor.class, target = ContractorDTO.class) public abstract UserDTO map(User user); }
这样生成的子类映射方法(employeeToEmployeeDTO、contractorToContractorDTO)会自动遵循全局规则,仅映射你显式指定的id、firstName、lastName属性,子类独有的designation、contractingCompanyName等属性不会被自动映射。
方案二:让子类映射方法继承父类配置
如果不想使用全局配置,可以显式定义子类映射方法,通过@InheritConfiguration复用父类的映射规则:
@Mapper(subclassExhaustiveStrategy = SubclassExhaustiveStrategy.RUNTIME_EXCEPTION) public abstract class UserMapper { @BeanMapping(ignoreByDefault = true) @Mapping(source = "id", target = "id") @Mapping(source = "firstName", target = "firstName") @Mapping(source = "lastName", target = "lastName") @SubclassMapping(source = Employee.class, target = EmployeeDTO.class) @SubclassMapping(source = Contractor.class, target = ContractorDTO.class) public abstract UserDTO map(User user); @InheritConfiguration(name = "map") protected abstract EmployeeDTO employeeToEmployeeDTO(Employee employee); @InheritConfiguration(name = "map") protected abstract ContractorDTO contractorToContractorDTO(Contractor contractor); }
@InheritConfiguration会继承父类map方法的@BeanMapping和@Mapping配置,确保子类映射方法也启用ignoreByDefault,且仅映射指定属性,无需重复编写映射规则。
验证效果:生成的子类映射方法中,只会保留id、firstName、lastName的映射代码,不会自动生成子类独有属性的映射逻辑。
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

