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
相关产品推荐
相关产品推荐

