博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring mybatis解决application.properties注入变量问题
阅读量:4338 次
发布时间:2019-06-07

本文共 2590 字,大约阅读时间需要 8 分钟。

问题描述

在使用spring mybatis的时候配置数据源dataSource,为了修改方便,新建了一个application.properties其中保存了jdbc.url,jdbc.username等信息。

这样在dataSource定义的时候 可以直接使用jdbc.url这些变量。使用方式为 ${jdbc.url},可是配置完成之后,启动程序报错,
报错原因是application中的jdbc.url变量没有注入到datasource中。

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0' defined in ServletContext resource [/****/application-context.xml]: Initialization of bean failed;nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource[/***/application-context.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource';nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/*****/application-context.xml]: Initialization of bean failed;nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'Java.lang.String' to required type 'int' for property 'checkoutTimeout';nested exception is java.lang.NumberFormatException: For input string: "${cpool.checkoutTimeout}"

问题原因

在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会导致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将无法获取到properties文件里的内容。

导致这一原因是因为,MapperScannerConigurer在spring启动过程中提前加载,,这个时候要是引用sqlSessionFactory的话,会导致sqlSessionFactory 提前加载,而此时PropertyPlaceholderConfigurer这个类还没有加载完成,也就无法完成表达式=》值的替换工作。自然sqlSessionFactory属性配置的表达式还没有替换成properties文件相应的值, sqlSessionFactory就被迫初始化了,所以在之后访问数据的时候,因为连不上数据库,就报错。

解决方法

1.MapperScannerConigurer如果是引用了sqlSessionFactory bean,则注释掉该行,

2.也可以添加如下一行配置。此时在MapperScannerConfigurer初始化的的时候只是传了一个beanName非bean,所以不会引发提前初始化问题。但是这里设置的beanName一定要和定义的Bean sessionFactory的id一样

代码如下:

环境配置

maven配置

org.mybatis
mybatis
3.2.7
org.mybatis
mybatis-spring
1.2.2
org.springframework
spring-core
4.1.4.RELEASE

参考

PropertyPlaceholderConfigurer介绍和应用:http://www.cnblogs.com/yl2755/archive/2012/05/06/2486752.html

spring引入properties中的变量

通过配置

转载于:https://www.cnblogs.com/chenny3/p/10226179.html

你可能感兴趣的文章
通过反射(Reflection)实现对ref和out参数在 Portal-Builder 开源门户系统中的调用...
查看>>
老李分享:锁定客户的六大策略:教你如何将切换成本嵌入商业模式 1
查看>>
课下必做MyCP
查看>>
eazyui的分页传值,Mybatis
查看>>
【仅支持移动设备】Swipe.JS轻量级移动幻灯效果
查看>>
rsyslog简介及配置简单的日志服务器(基于mysql)
查看>>
模块and包
查看>>
【总结】01背包问题
查看>>
解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始
查看>>
理解爬虫原理
查看>>
基础 - SVG
查看>>
Python基础-OS模块
查看>>
canvas填充样式
查看>>
Python----面向对象---异常处理
查看>>
[源码和文档分享]基于Newban的Nancyj字体Email签名工具
查看>>
文本框宽度自动适应文本宽度<
查看>>
委拖 lambda 匿名方法 匿名类 扩展方法
查看>>
整体二分——离线整体处理
查看>>
Python with语句
查看>>
ARC下dealloc过程及.cxx_destruct的探究
查看>>