Spring Boot无法读取Properties文件配置值的问题求助
我在使用Spring Boot 3.4.1时遇到了一个棘手的问题:没法从配置文件里读取参数。一开始我用的是默认机制——把application.properties放在resources文件夹里,但没成功。后来我改成外部化配置文件的方式,代码如下:
@PropertySource("file:/home/user/myapp/myapp.properties") @SpringBootApplication public class MyApplication { public static void main(String... args) { SpringApplication.run(MyApplication.class, args); } }
看起来这个配置是有效的——因为如果我删除(或重命名)myapp.properties文件,启动应用时就会直接报错:APPLICATION FAILED TO START Config data resource 'file [/home/user/myapp/myapp.properties]' via location 'file:///home/user/myapp/myapp.properties' does not exist
这说明Spring确实能找到这个配置文件,但我在组件里读取参数时却始终拿不到值。我的Controller代码是这样的:
@RestController public class MyAppController { @Value("${staticRepo}") private String staticRepo; @GetMapping(value = "/api/myapp") List<Foo> getFoo() { if (staticRepo== null || staticRepo.trim().isEmpty()) { throw new InternalServerErrorException("MyApp is not configured properlly. Missing 'staticRepo' parameter in 'myapp.properties'"); } return FooUtils.load(staticRepo); } }
我反复检查了myapp.properties文件,里面确实有staticRepo参数(文件内容只有一行):
staticRepo=/home/user/myapp/repo/
我搜了好几个类似问题的帖子,但都没解决我的问题。其中一个帖子建议用命令行指定配置文件,我试了但还是没用:
java -jar /home/user/myapp/myapp.jar --spring.config.location=file:///home/user/myapp/myapp.properties
所以想问问大家:我到底哪里做错了?
编辑补充
按照网上的建议,我把变量名改成了repo,但问题依然存在。我也确认了@Value注解的包是org.springframework.beans.factory.annotation.Value,没有导错包。
而且这不是简化后的示例——除了修改了路径和应用名称,代码就是我贴出来的那样。为了彻底排查问题,我用VS Code(v1.96.2)的Spring Initializr Java Support(v0.11.2)向导从头生成了一个全新的应用。向导自动在/src/main/resources里创建了application.properties,里面默认有spring.application.name=demo这个配置,但我在代码里读取这个值时,输出的结果居然是null……
我的运行环境是Ubuntu 24.04.2 LTS,OpenJDK 21.0.6。新建的Demo项目代码如下:
@SpringBootApplication public class DemoApplication { @Value("${spring.application.name}") private String name; public static void main(String[] args) { DemoApplication demo = new DemoApplication(); System.out.println(demo.getName()); SpringApplication.run(DemoApplication.class, args); } public String getName() { return name; } }
备注:内容来源于stack exchange,提问作者Bob Rivers

