Spring @Value注入值失败,错误信息提示:Could not resolve placeholder

问题根源:

1@Value("${wx.app.config.appid}") 2public Object appid;

异常信息:

1Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'wx.app.config.appid' in string value "${wx.app.config.appid}" 2 at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) 3 at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) 4 at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) 5 at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) 6 at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) 7 at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:823) 8 at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1084) 9 at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1064) 10 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) 11 at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 12 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) 13 ... 79 more

解决方法:

Spring引入.properties文件的两种方法(如下)

1.通过xml方式加载.properties文件

1<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 2 <property name="locations"> <!-- PropertyPlaceholderConfigurer类中有个locations属性,接收的是一个数组,即我们可以在下面配好多个properties文件 --> 3 <array> <!-- 也可以使用通配符的配置方式 --> 4 <value>classpath:conn.properties</value> 5 </array> 6 </property> 7</bean>

2.通过注解方式加载.properties文件

1<context:ignore-unresolvable="true" location="classpath:config/**/*.properties" system-properties-mode="OVERRIDE"/><!--location:表示属性文件位置,多个之间通过如逗号/分号等分隔;--> 2<!--file-encoding:文件编码;--> <!--ignore-resource-not-found:如果属性文件找不到,是否忽略,默认false,即不忽略,找不到将抛出异常--> <!--ignore-unresolvable:是否忽略解析不到的属性,如果不忽略,找不到将抛出异常--> <!--properties-ref:本地java.util.Properties配置--> <!--local-override:是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性--> <!--system-properties-mode:系统属性模式,ENVIRONMENT(默认),NEVEROVERRIDE--> <!--ENVIRONMENT:将使用Spring 3.1提供的PropertySourcesPlaceholderConfigurer,其他情况使用Spring 3.1之前的PropertyPlaceholderConfigurer--> <!--OVERRIDEPropertyPlaceholderConfigurer使用,因为在spring 3.1之前版本是没有Enviroment的,所以OVERRIDE是spring 3.1之前版本的Environment--> <!--NEVER:只查找properties-ref、location--> <!--order:当配置多个<context:property-placeholder/>时的查找顺序-->

知道了怎么配置,就知道自己有没有配置错误,如果配置没有问题,那么就继续找问题,Could not resolve placeholder占位符不能被解析,那就是没有在.properties中找到要注入的值了,原来是在xml里面配置了2个ignore-unresolvable,这就是定位问题所在了。

1<!-- 配置数据库相关参数properties的属性:${url} --> 2<context:property-placeholder location="classpath*:/mybatis/db.properties"/> 3<!-- 引入property文件 --> 4<context:property-placeholder ignore-unresolvable="true" location="classpath:config/config-wxapp.properties" ignore-resource-not-found="true"/>

一个是引入配置文件.properties,一个是引入db配置文件.properties,其实配置多个并不是报错的主要问题所在,是因为spring的加载机制,原来是Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了),所以根据加载的顺序,配置的第二个property-placeholder就被没有被spring加载,我想引入的config-wxapp.properties就没有被引入,所以在使用@Value注入的时候占位符就解析不了...解决方法就是把2个property-placeholder注解配置合并在一起就好了

1<!-- 引入property文件 --> 2<context:property-placeholder ignore-unresolvable="true" location="classpath*:config/config-*.properties,classpath*:mybatis/db.properties" ignore-resource-not-found="true"/>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Spring @Value注入值失败,错误信息提示:Could not resolve placeholder - HelloWorld