- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MyBatis启动时控制台无限输出日志的原因及解决办法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
你是否遇到过下面的情况,控制台无限的输出下面的日志:
Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. 。
这个错误只有在和Spring集成的情况下才会出现.
每次只要出现这个错误,我都知道是XML出错了,但是具体是那个XML还没法直接确认,因为这里的日志看不出来任何有用的信息.
想定位这个错误,我有一个常见的方法,就是从程序启动的某一个入口断点,然后逐步定位这个错误.
不过这种方式仍然很麻烦,这里要说的是一种迅速定位解决的办法,操作起来很简单.
找到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 类,在下面方法:
1
2
3
4
5
6
|
protected
void
autowireByType(
String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
这个方法大概在
1200
行左右。找到这个方法中
catch
异常的地方:
catch
(BeansException ex) {
throw
new
UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
}
|
在throw这一行断点即可,这个地方是最早捕获异常的地方,当Mapper.xml文件出错的时候,这里的异常信息如下:
异常信息是很详细的,具体异常文字如下:
org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [F:\Liu\Git\bhgl\target\Franchisee-1.0\WEB-INF\classes\com\abel533\property\dao\EmployeeMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容.
打开这个出错的XML后,发现一个很无语的错误:
不知道什么情况,开头多了emplo,基本上只要是 XML 中出什么错,都是类似的异常信息,一般都是 XML 解析出的错.
还有一个问题,为什么出错后只能看到无限输出的一行日志,而看不到这里具体的异常信息呢?
通过追踪代码,发现在org.springframework.beans.factory.support.AbstractBeanFactory类中的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
protected
Class<?> getTypeForFactoryBean(String beanName, RootBeanDefinition mbd) {
if
(!mbd.isSingleton()) {
return
null
;
}
try
{
FactoryBean<?> factoryBean = doGetBean(FACTORY_BEAN_PREFIX + beanName, FactoryBean.
class
,
null
,
true
);
return
getTypeForFactoryBean(factoryBean);
}
catch
(BeanCreationException ex) {
// Can only happen when getting a FactoryBean.
if
(logger.isDebugEnabled()) {
logger.debug(
"Ignoring bean creation exception on FactoryBean type check: "
+ ex);
}
onSuppressedException(ex);
return
null
;
}
}
|
这里捕获异常后,直接return null导致异常被吞.
由于这里是最后一层捕获异常的地方,而且这个地方捕获到的异常范围会更广,因此在这里断点查看问题也是很不错的选择,由于这里经过多层异常处理,真正的错误信息隐藏的比较深,如下图:
看到这儿,相信再遇到这个问题的时候应该会很容易解决了.
原文链接:http://blog.csdn.net/isea533/article/details/51277786 。
最后此篇关于MyBatis启动时控制台无限输出日志的原因及解决办法的文章就讲到这里了,如果你想了解更多关于MyBatis启动时控制台无限输出日志的原因及解决办法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!