SpringBoot重写configure方法时@Value注入的ids.baseUrl为null问题
问题根本原因
出现idsBaseUrl取值为null的核心原因是方法执行时序早于Spring依赖注入的完成节点:
SpringBootServletInitializer的configure方法,是应用以WAR包形式部署到外部Servlet容器时的初始化回调入口,触发时机处于Spring应用上下文初始化的最早期。- 这个阶段Spring容器还没有完成对主类实例的字段装配,所有标注
@Value、@Autowired的字段都未被赋值,此时直接读取实例上的idsBaseUrl字段,自然只会拿到类定义的默认初始值null。
可落地的解决方案
- 规避在
configure方法内读取需要依赖注入的配置值:将配置读取逻辑迁移到Spring容器完全启动后的执行节点,比如监听ApplicationReadyEvent事件,在容器就绪的回调方法中读取ids.baseUrl配置,再执行业务初始化逻辑,从根源上绕开启动早期的注入时序问题。 - 如果必须在启动初始化阶段获取配置值,不要依赖字段注入,改为手动加载配置源读取值:直接在
configure方法中读取classpath下的配置文件,拿到ids.baseUrl的值后传入后续初始化流程,完全不依赖Spring的@Value注入机制。参考实现:@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { Properties configProps = new Properties(); String idsBaseUrl; // 手动加载指定配置文件 try (InputStream configStream = CDIClaireRecommendationApplication.class .getResourceAsStream("/cdiclairerecommendation-service-application.properties")) { configProps.load(configStream); idsBaseUrl = configProps.getProperty("ids.baseUrl"); } catch (IOException e) { throw new IllegalStateException("加载应用配置失败", e); } // 将读取到的配置值传入监听器完成初始化 return application.sources(CDIClaireRecommendationApplication.class) .listeners(new ApplicationStartingEventListener(idsBaseUrl)); } - 如果是通过本地main方法直接启动应用的场景,本身不会触发
configure方法的执行逻辑,可直接删除该方法内的配置读取代码,避免出现时序误判。
内容的提问来源于stack exchange,提问作者shivali
相关产品推荐
相关产品推荐

