spring引入properties變量報錯

經過properties配置文件配置數據源,代碼以下:html

<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>

項目啓動報錯:java

org.springframework.beans.TypeMismatchException。。。。web

java.sql.SQLException: ${db.jdbc.driverClassName}spring

經查閱資料發現是此配置引發:sql

<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.xiaomu.**.dao" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

 

緣由:mybatis

MapperScannerConfigurer自定義了bean的初始化接口,在其初始化時placeholder還未初始化,致使properties值還沒注入進來而報錯app

 

解決:ui

MapperScannerConfigurer注入 sqlSessionFactory 的時候有兩種選擇一種是在spring配置的時候直接注入sqlSessionFactory對象,另外一種是sqlSessionFactoryBeanName經過名字來注入bean。url

故將<property name="sqlSessionFactory" ref="sqlSessionFactory" />改成<property name="sqlSessionFactoryBeanName" value="mybatisSqlSessionFactory" />便可,注意改事後value值不能使用原來的sqlSessionFactory名稱,由於是經過名稱注入,故使用sqlSessionFactory依然會報錯。spa

注: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

相關文章
相關標籤/搜索