SpringBoot读取application.yaml配置值为null问题排查
问题原因
配置值为null和多环境profile配置、yaml语法无关,核心错误是对象创建方式不符合Spring依赖注入规则:
@Value属性注入仅对Spring IoC容器托管的Bean生效,容器初始化Bean时才会解析配置、完成属性赋值。- 代码中
SpringApplication.run()执行完成后,手动通过new App()创建了全新的App类实例,该实例完全脱离Spring容器管理,Spring不会对其执行属性注入,类中两个字段自然保持默认值null。 - Spring启动时已经扫描到
@SpringBootApplication标记的App类,在容器内部生成了完成属性注入的App实例,但代码没有使用这个托管实例,反而调用了手动new出的未注入实例的方法,最终打印null。
修复方案
修改main方法逻辑,不要手动new App实例,直接从Spring运行返回的应用上下文中获取容器托管的App Bean即可:
@SpringBootApplication public class App { @Value("${application.id}") private String applicationId; @Value("${my.server}") private String server; public static void main(String args[]) { // 获取Spring启动后的上下文对象 ConfigurableApplicationContext context = SpringApplication.run(App.class, args); // 从容器中获取已经完成属性注入的App Bean App app = context.getBean(App.class); app.display(); } public void display(){ System.out.println("Application Id : "+ applicationId); System.out.println("Server : "+ server); } }
修改后运行即可正常读取dev环境对应的配置值,输出结果如下:
Application Id : dev-app Server : localhost:8080
内容的提问来源于stack exchange,提问作者Digres
相关产品推荐
相关产品推荐

