Spring Boot依赖中@Value注入maxAngle失败问题排查
看起来你碰到了一个典型的跨Spring Boot应用依赖时的配置解析问题,我来帮你拆解几个最可能的原因:
依赖应用的配置未被主应用加载
Spring Boot默认不会自动读取依赖jar包中的application.properties或application.yml配置文件。如果你的maxAngle配置是定义在应用A的配置文件里的,主应用根本找不到这个配置项,自然就解析不了${maxAngle}占位符。XML配置与@Value注解的优先级冲突
你在XML里已经给myBean的maxAngle设了固定值360,但setMaxAngle方法上又加了@Value("${maxAngle}")。单独跑应用A时,要么Spring优先用了XML的配置,要么应用A自己的配置里刚好有maxAngle值,所以没出问题。但到了主应用里,Spring可能优先尝试处理@Value的注入,而此时没有对应的配置,就抛出了错误。主应用缺少对应的配置属性
如果你原本就打算让主应用来提供maxAngle的值,那主应用的配置文件里必须要有这个属性。要是主应用没配置,Spring找不到占位符对应的取值,肯定会报错。配置加载顺序导致的覆盖或缺失
就算依赖应用的配置被加载了,也可能因为主应用的配置优先级更高,覆盖了依赖里的配置,但主应用又没设置maxAngle,最终还是解析失败。或者依赖的配置文件根本没被正确引入到主应用的配置上下文里。注解处理器未正常工作
虽然XML已经定义了myBean,但@Value注解需要Spring的AutowiredAnnotationBeanPostProcessor来处理。虽然Spring Boot默认会激活这个处理器,但如果主应用的配置里禁用了相关自动配置,或者处理器的加载顺序有问题,也会导致@Value无法被解析。
几个快速排查的方向:
- 如果
maxAngle是应用A自带的配置,你可以在主应用的@SpringBootApplication上添加@PropertySource("classpath:/application.properties")(假设应用A的配置文件叫这个名字),强制引入依赖的配置;或者在应用A里把配置放到META-INF/spring.factories里,让Spring Boot自动加载。 - 去掉XML和@Value的冲突项:要么删掉XML里的
<property name="maxAngle" value="360"/>,让@Value去读配置;要么删掉@Value注解,只用XML的固定值。 - 在主应用的配置文件里添加
maxAngle=360(或者你需要的数值),给占位符提供明确的取值。
内容的提问来源于stack exchange,提问作者Mandroid

