spring引入properties变量报错
通过properties配置文件配置数据源,代码如下:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="order" value="3" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="locations"> <list> <value>classpath:config/db.properties</value> <!-- 注意路径写法,上面写法要加classpath,路径前不能有/,此下面写法properties文件要在WEB-INF目录下,路径前要有/ <value>/WEB-INF/test.properties</value> --> </list> </property> </bean> <!-- 自定义数据源 --> <bean id="dataSource" name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="${db.jdbc.driverClassName}" /> <property name="url" value="${db.jdbc.url}" /> <property name="username" value="${db.jdbc.username}" /> <property name="password" value="${db.jdbc.password}" /> <!-- 配置初始化大小、最大连接数量 --> <property name="initialSize" value="${db.initialSize}"/> <property name="maxActive" value="${db.maxActive}"/> <!-- 连接最大等待时间 --> <property name="maxWait" value="${db.maxWait}" /> <property name="poolPreparedStatements" value="true" /> <property name="defaultAutoCommit" value="true" /> <!-- 连接池最大、最小空闲 --> <property name="maxIdle" value="${db.maxIdle}" /> <property name="minIdle" value="${db.minIdle}" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}" /> <!-- 校验语句 --> <property name="validationQuery" value="select 1 from dual"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="false"/> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat"/> </bean>
项目启动报错:
org.springframework.beans.TypeMismatchException。。。。
java.sql.SQLException: ${db.jdbc.driverClassName}
经查阅资料发现是此配置引起:
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xiaomu.**.dao" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
原因:
MapperScannerConfigurer自定义了bean的初始化接口,在其初始化时placeholder还未初始化,导致properties值还没注入进来而报错
解决:
MapperScannerConfigurer注入 sqlSessionFactory 的时候有两种选择一种是在spring配置的时候直接注入sqlSessionFactory对象,另一种是sqlSessionFactoryBeanName通过名字来注入bean。
故将<property name="sqlSessionFactory" ref="sqlSessionFactory" />改为<property name="sqlSessionFactoryBeanName" value="mybatisSqlSessionFactory" />即可,注意改过后value值不能使用原来的sqlSessionFactory名称,因为是通过名称注入,故使用sqlSessionFactory依然会报错。
注:sqlSessionFactoryBeanName为非必须标签,单数据源时可以不用配置
说明:
MapperScannerConfigurer作用和mappers标签作用类似,都是扫描mapper确定映射关系,mapper配置形式为:
<mappers> <!-- sql文件配置方式一:指定文件路径位置,sql.xml文件namespace可以直接用dao名称,注意此时sql.xml文件要在resource目录下 --> <!-- <mapper resource="mybatis/sqlmap/user/brokerinfoMapper.xml"/> --> <!-- sql文件配置方式二:sql文件和dao接口放在同一个目录下,只需要配置sql.xml文件和接口所在包路径 , 但是sql.xml的namespace要是dao接口的完整路径--> <!-- <package name="com.test.web.dao"/> --> </mappers>
参考原文地址:https://www.cnblogs.com/LionheartCGJ/p/7886423.html