springboot注解@Value总是报Could not resolve placeholder的问题
Posted tiramisuyj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot注解@Value总是报Could not resolve placeholder的问题相关的知识,希望对你有一定的参考价值。
场景:
两个配置文件:db.properties,application.properties
在数据库配置里面引用db.properties
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/db.properties</value>
<value>file:/etc/db.properties</value>
</list>
</property>
</bean>
这时候,application.properties里面的属性就不会被加载进去了,如果你使用@Value,就会报Could not resolve placeholder
@Controller public class FirstController { @Value("${welcome.message}") private String test; @RequestMapping("/getw") public String welcome(Map<String, Object> model) { //model.put("message", this.message); System.out.println(test); return "my"; } }
这样使用就会报Could not resolve placeholder
解决:
把db.properties的内容放到application.properties,然后这边引用:
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/application.properties</value>
<value>file:/etc/application.properties</value>
</list>
</property>
</bean>
或者两个文件都加载
<bean id="propertyPlaceholderConfigurer" class="...">
<property name="locations">
<list>
<value>classpath*:/application.properties</value>
<value>classpath*:/db.properties</value>
<value>file:/etc/application.properties</value>
</list>
</property>
</bean>
原因是spring的加载机制:Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了),所以根据加载的顺序,配置的第二个property-placeholder就被没有被spring加载,所以在使用@Value注入的时候占位符就解析不了
以上是关于springboot注解@Value总是报Could not resolve placeholder的问题的主要内容,如果未能解决你的问题,请参考以下文章
解决启动SpringBoot项目加载 @Value注解报异常问题
关于在springboot中利用@Value注解读取配置文件中的属性值得问题
[坑]Spring利用注解@Value获取properties属性为null
SpringBoot系列之@ConfigurationProperties VS @Value注解