You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:06