PAYATHON 2026

Spring Boot application.yml 中反斜杠导致占位符不解析怎么办?

数据小许

结论

可以把 UNC 路径开头的两个反斜杠单独配置为一个属性,再与 ${host} 拼接,避免反斜杠直接出现在占位符前面。

Spring Framework 6.2 引入了占位符转义规则,默认使用 \ 转义 ${...},题目中的现象与这项规则相符。由于题目没有给出具体版本,排查时应先确认应用实际使用的 Spring Framework 版本。Spring Framework 6.2 发布说明

为什么 ${host} 没有被替换?

原配置是:

host: example.com
unc-path: \\${host}\share

配置先由 YAML 读取,再由 Spring 解析字符串中的占位符。

在这段未加引号的 YAML 标量中,反斜杠会保留下来。接着,启用默认转义规则的 Spring 占位符解析器会把 ${host} 前紧邻的反斜杠视为转义符,移除它并保留字面的 ${host},因此可能得到题目中的结果:

\${host}\share

这里不能直接套用 Java 字符串的规则:把反斜杠加倍也不能让占位符恢复解析。Spring 官方问题记录列出了这种行为。占位符反斜杠处理说明

方案一:把路径前缀拆成独立属性

将 application.yml 改为:

host: example.com
unc-prefix: '\\'
unc-path: '${unc-prefix}${host}\share'

YAML 单引号字符串中的反斜杠按字面保留,所以 unc-prefix 的值是两个反斜杠。unc-path 的配置表达式中,${host} 前面没有紧邻的反斜杠,可以正常参与占位符解析。

通过 Spring 的属性解析机制读取 unc-path,例如调用 Environment.getProperty("unc-path"),预期结果为:

\\example.com\share

这种拆分方式符合 Spring 6.2 发布说明中的调整方向:将原本紧邻占位符的反斜杠移入属性值中。配置迁移说明

仅给原来的整条路径加上 YAML 单引号,不能关闭 Spring 的占位符转义;单引号只控制 YAML 层的字符串处理。

方案二:关闭默认占位符转义

如果应用使用 Spring Framework 6.2.7 或支持该设置的后续版本,也可以关闭默认占位符转义,保留原始 application.yml:

host: example.com
unc-path: \\${host}\share

在 src/main/resources/spring.properties 中加入:

spring.placeholder.escapeCharacter.default=

等号后保持空值。也可以在启动时通过 JVM 系统属性设置:

java -Dspring.placeholder.escapeCharacter.default= -jar app.jar

将 app.jar 替换为实际文件名。这个选项通过 JVM 系统属性或 SpringProperties 机制生效,应放在上述位置,不要直接当作普通 application.yml 配置项使用。默认转义字符配置说明

关闭后,使用该默认设置的解析器将不再把 \${...} 识别为转义占位符。如果其他配置依赖这种写法保留字面的 ${...},其行为也会改变。只需解决这条 UNC 路径时,优先采用拆分前缀的方案。

备注:内容仅供参考。