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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM