spring.application.json在Windows系统不生效,Linux正常的问题咨询
你遇到的问题根源在于Windows和Linux的命令行对引号、特殊字符的解析规则完全不同,导致spring.application.json的JSON内容在Windows下没有被Spring Boot正确识别。
为什么会这样?
在Linux的shell(比如bash)中,你直接传递-Dspring.application.json={"foo": "bar"}时,shell会把整个JSON字符串作为一个完整的参数传递给Java进程,Spring Boot能正确解析这个JSON并创建MapPropertySource,所以你能看到那条转换日志。
但在Windows的CMD或PowerShell中,双引号和大括号的处理逻辑不一样:
- CMD会把双引号作为参数边界,直接传
{"foo": "bar"}的话,会被拆分成多个片段,Spring Boot拿到的不是完整的JSON,自然无法创建对应的属性源,也就不会输出那条日志。 - PowerShell虽然对引号的处理更灵活,但默认也会解析双引号内的特殊字符,导致JSON结构被破坏。
解决方法
针对不同的Windows命令行环境,有两种正确的传递方式:
1. 使用CMD时
需要用反斜杠\转义JSON里的双引号,并且把整个-D参数包裹在一对双引号里:
java -D"spring.application.json={\"foo\":\"bar\"}" -jar your-app.jar
或者先设置系统变量再启动:
set "spring.application.json={\"foo\":\"bar\"}" java -jar your-app.jar
2. 使用PowerShell时
可以用单引号包裹整个JSON(PowerShell不会解析单引号内的内容),或者用反引号`(键盘左上角~键)转义双引号:
# 方式1:单引号包裹JSON java -Dspring.application.json='{"foo":"bar"}' -jar your-app.jar # 方式2:反引号转义双引号 java -Dspring.application.json="`{`"foo`":`"bar`"}" -jar your-app.jar
更稳妥的跨平台方案
如果不想纠结命令行的差异,建议直接把配置放到application.properties或application.yml中:
- 在
application.properties里添加:spring.application.json={"foo":"bar"} - 在
application.yml里添加:spring: application: json: '{"foo": "bar"}'
这种方式在任何系统下都能正常生效,不需要考虑命令行解析的问题。
验证效果
当你用正确的方式传递参数后,Windows系统的日志里应该会出现和Linux一样的EncryptablePropertySourcesPostProcessor信息,说明spring.application.json已经被正确加载并转换。
内容的提问来源于stack exchange,提问作者SBM

