• 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

  • 相关阅读:
    二分题目
    求最小公倍数的最简模板
    用 vue 脚手架 vue-cli 初始化(新建)项目
    电脑没有声音
    node.js 安装步骤
    phpStrom编辑器 通过 git 提交代码到 gitlab
    jq 实现头像(气泡式浮动)
    微信网页授权 、获取用户昵称 头像等信息
    秒格式化 “秒” 为 天 时 分 秒
    改变swiper 按钮swiper-button-next 颜色
  • 原文地址:https://www.cnblogs.com/leskang/p/9772567.html
Copyright © 2020-2023  润新知