gpt4 book ai didi

MyBatis启动时控制台无限输出日志的原因及解决办法

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

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文件出错的时候,这里的异常信息如下:

MyBatis启动时控制台无限输出日志的原因及解决办法

异常信息是很详细的,具体异常文字如下:

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后,发现一个很无语的错误:

MyBatis启动时控制台无限输出日志的原因及解决办法

不知道什么情况,开头多了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导致异常被吞.

由于这里是最后一层捕获异常的地方,而且这个地方捕获到的异常范围会更广,因此在这里断点查看问题也是很不错的选择,由于这里经过多层异常处理,真正的错误信息隐藏的比较深,如下图:

MyBatis启动时控制台无限输出日志的原因及解决办法

看到这儿,相信再遇到这个问题的时候应该会很容易解决了.

原文链接:http://blog.csdn.net/isea533/article/details/51277786 。

最后此篇关于MyBatis启动时控制台无限输出日志的原因及解决办法的文章就讲到这里了,如果你想了解更多关于MyBatis启动时控制台无限输出日志的原因及解决办法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com