今天修改了一些东西后,发现web项目启动不了了。日志中出现504组如下的日志,都是mybatis打印的,扫描jar,解析dao,mapping文件等信息。费了半天劲,也没有找到问题。因为这些全是debug级别的,我就没有在意。后来发现每组的最后一条信息"Ignoring bean creation exception...",有错误信息,才发现问题的根源是mybatis的mapping.xml文件中,语句的id重复了。
可问题是
1.为什么会打印这么多重复的日志呢?
2.为什么只有debug级别的日志呢?
问题1:
通过对日志 和源码的学习,终于把第一问题解答了。
1). dao类是需要注入一个SqlSessionFactory的。mybatis与spring整合,对应的是SqlSessionFactoryBean类。
2). SqlSessionFactoryBean在创建的时候,会加载所有的mapping文件。
3). 当加载失败的时候,不会抛出异常,只是打印了一个debug级别的日志。刚才提到的"Ignoring bean creation exception..."信息。
所以程序会继续进行。
4). 然后,当每次需要注入“依赖 [此SqlSessionFactoryBean类] 的Dao类”的时候,就会打印一组 3)中的错误信息。
so,当有很多类依赖这些Dao的时候,就有了这504组错误信息。。
问题2:
查看了所有的日志,发现只有这一行信息能够清楚的说明问题的原因。这一行信息是由spring记录的。( org.springframework.beans.factory.support.AbstractBeanFactory#getTypeForFactoryBean )
估计他并不想直接吞掉这个异常,因为把这个Exception放入了suppressedExceptions属性里,可能会在必要的时候统一抛出。
可是,在这种情况下,他并没有抛出正确的异常。不知算不算mybatis-spring的bug。总之,这种编程问题,在测试环境下,就可以发现,不会影响生产环境,所以问题也不大。不过这种处理方式,错信息混杂在debug级别的信息中,确实不太好定位问题。
附两组日志:
DEBUG DefaultListableBeanFactory - Creating shared instance of singleton