如何在org.mapstruct.Mapping注解中使用toString()作为映射源?
错误原因说明
你之前的两种写法均是对@Mapping注解的属性使用错误:
source属性仅支持传入源参数的JavaBean属性名(对应类的getXxx/isXxx方法),不支持直接调用方法,也不识别Java表达式语法- 自定义Java表达式需要使用
expression属性,而非source属性
实现方案
方案1:使用expression属性(最直接适配你的写法)
将自定义逻辑放在expression参数中即可,正确写法如下:
@Mapper(componentModel = "spring") public interface FooMapper { @Mapping(target = "date", expression = "java(value.toString())") String map(Foo value); }
如果是将Foo的toString映射到其他业务对象的字段,写法逻辑完全一致,示例:
// 假设目标类是Bar,包含String类型的date字段 @Mapper(componentModel = "spring") public interface FooMapper { @Mapping(target = "date", expression = "java(foo.toString())") Bar fooToBar(Foo foo); }
如果表达式中用到了非java.lang包下的类,需要将对应类配置到@Mapper注解的imports属性中,本次使用的toString是Foo类自带方法,无需额外导入
方案2:使用接口默认方法实现(更推荐)
如果该映射逻辑使用频率高,更推荐用JDK8支持的接口默认方法实现,逻辑更直观,也方便自行处理空指针等边界场景:
@Mapper(componentModel = "spring") public interface FooMapper { default String map(Foo value) { return value == null ? null : value.toString(); } }
该方案完全符合你所有约束条件,不需要修改Foo类,也兼容MapStruct1.4.2.Final和JDK1.8版本。
内容的提问来源于stack exchange,提问作者THM
相关产品推荐
相关产品推荐

