问题描述:Spring中xml配置并使用了properties文件,项目启动时,提示找不到变量。
引入properties的配置如下
<context:property-placeholder location="classpath:important.properties,classpath:extend.properties"/>
properties文件如下
order.jdbc0.url=jdbc:mysql://45140.mysql.db.com:3358/order?characterEncoding=UTF8
order.jdbc1.url=jdbc:mysql://45140.mysql.db.com:3358/order?characterEncoding=UTF8
order.jdbc2.url=jdbc:mysql://45140.mysql.db.com:3358/order?characterEncoding=UTF8
变量如下:
<bean id="dataSource0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${order.jdbc0.url}" />
<property name="username" value="${order.jdbc0.username}" />
<property name="password" value="${order.jdbc0.password}" />
<property name="filters" value="config" />
<property name="maxWait" value="15000" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<property name="minEvictableIdleTimeMillis" value="180000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
</bean>
追踪:确认变量的k和别名一一对应,无重复引用,placeHolder确实加载了properties文件,变量所在bean的初始化在placeHolder之后,和Bean启动顺序无关。
Debug了placeHolder的变量栈,发现变量池中变量order.jdbc0.url前面有一个制表符,导致识别不了这个变量。properties文件使用GBK编码,且此变量位于该文件的第一行第一个字符起,在变量前面加上一个回车后问题解决;又,把原文件使用txt清洗后再放进来,问题还会出现,因此必然和编码转换相关。