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

Mapstruct是否支持读取application.properties配置值为映射字段赋值?

结论

你写的这种写法不可行,原因如下:

  • MapStruct 的 @Mapping 注解的 expression 属性仅支持传入可直接编译的 Java 代码片段,无法直接解析 Spring 配置文件的 ${} 占位符
  • MapStruct 是在编译阶段生成 Mapper 实现类代码的,此时 application.properties 配置还未被加载,占位符根本无法被识别替换
可行实现方案(Spring 环境)

首先要保证你的 Mapper 交给 Spring 容器管理,也就是在 @Mapper 注解中指定 componentModel = "spring",然后有两种常用实现方式:

方案1:直接在 expression 中引用注入的配置值

将 Mapper 定义为抽象类,注入配置属性后直接在表达式中调用:

@Mapper(componentModel = "spring")
public abstract class StateMapper {

    // 注入配置文件属性
    @Value("${application.version}")
    protected String applicationVersion;

    @Mapping(target = "version", expression = "java(applicationVersion)")
    public abstract StateDto stateToStateDto(State state);
}

方案2:使用 @AfterMapping 统一填充配置属性

适合需要填充多个配置属性的场景,代码更易维护:

@Mapper(componentModel = "spring")
public abstract class StateMapper {

    @Value("${application.version}")
    private String applicationVersion;

    public abstract StateDto stateToStateDto(State state);

    // 映射完成后自动执行该方法填充配置值
    @AfterMapping
    public void fillVersion(@MappingTarget StateDto target) {
        target.setVersion(applicationVersion);
    }
}
非Spring环境实现方案

如果你的项目没有使用 Spring,可提前将配置文件中的属性加载到静态常量类中,再直接在 expression 中引用静态常量即可:

// 提前加载配置到常量类
public class AppConfig {
    public static final String APP_VERSION = loadFromProperties("application.version");

    private static String loadFromProperties(String key) {
        // 自行实现读取配置文件逻辑
    }
}

// Mapper 写法
@Mapper
public interface StateMapper {
    @Mapping(target = "version", expression = "java(com.xxx.AppConfig.APP_VERSION)")
    StateDto stateToStateDto(State state);
}

内容的提问来源于stack exchange,提问作者Scala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:03