使用MapStruct映射对象时如何对List内对象的字符串自动执行trim
MapStruct集合元素字符串属性Trim不生效解决方案
问题原因
你现有代码的问题在于@Mapping(target = "addresses.name", qualifiedByName = "trim")的写法不符合MapStruct的语法规则,MapStruct无法直接为集合类型属性内部的元素字段指定转换规则,这个写法的寻址逻辑是匹配addresses对象下的name属性,而你这里addresses是List类型,不存在name字段,所以trim逻辑不会被触发。
解决方案
方案1:单独定义集合元素的映射方法
该方案灵活性最高,仅针对本次映射场景下的Address类指定字段做trim,不会影响其他业务逻辑:
@Mapper public interface PersonMapper { PersonA mapToPersonA(final PersonB person); // 单独定义单个Address对象的映射规则,MapStruct会自动调用该方法处理List中的每个元素 @Mapping(target = "name", qualifiedByName = "trim") Address mapToAddress(Address address); @Named("trim") static String trim(final String value) { return value != null ? value.trim() : null; } }
方案2:全局配置String类型自动trim
如果你的业务场景中所有字符串属性映射时都需要执行trim操作,可以直接定义全局默认的String转换方法,无需单独为每个字段加Mapping配置:
@Mapper public interface PersonMapper { PersonA mapToPersonA(final PersonB person); // 所有String类型的属性映射都会自动调用该方法执行trim default String trimString(String value) { return value != null ? value.trim() : null; } }
注意事项
- 确保Address类存在公共无参构造方法,否则MapStruct无法实例化Address对象完成映射
- 如果Address类包含其他需要trim的字符串字段,方案1需要为每个字段单独补充
@Mapping配置,方案2会自动处理所有String类型字段
内容的提问来源于stack exchange,提问作者jennifer lawrence
相关产品推荐
相关产品推荐

