spring引入properties變數報錯

木叔發表於2018-10-11

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

 

相關文章