zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    scp命令
    js代码片段
    js创建request对象与ajax请求
    多个action组成一个文件
    ng-option选项禁用
    IE日期
    ui-sortable
    P5多语言默认语言不生效BUG的解决办法
    防止多次点击提交按钮造成数据多次提交
    c#根据ip获取地理位置
  • 原文地址:https://www.cnblogs.com/leskang/p/9772567.html
Copyright © 2011-2022 走看看