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. 
Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImpl’ adapter.

这个错误只有在和Spring集成的情况下才会出现。

每次只要出现这个错误,我都知道是XML出错了,但是具体是那个XML还没法直接确认,因为这里的日志看不出来任何有用的信息。

想定位这个错误,我有一个常见的方法,就是从程序启动的某一个入口断点,然后逐步定位这个错误。

不过这种方式仍然很麻烦,这里要说的是一种迅速定位解决的办法,操作起来很简单。

找到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 类,在下面方法:

protected void autowireByType(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
        TypeConverter converter = this.getCustomTypeConverter();
        if (converter == null) {
            converter = bw;
        }

        Set<String> autowiredBeanNames = new LinkedHashSet(4);
        String[] propertyNames = this.unsatisfiedNonSimpleProperties(mbd, bw);
        String[] var8 = propertyNames;
        int var9 = propertyNames.length;

        for(int var10 = 0; var10 < var9; ++var10) {
            String propertyName = var8[var10];

            try {
                PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
                if (!Object.class.equals(pd.getPropertyType())) {
                    MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
                    boolean eager = !PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass());
                    DependencyDescriptor desc = new AbstractAutowireCapableBeanFactory.AutowireByTypeDependencyDescriptor(methodParam, eager);
                    Object autowiredArgument = this.resolveDependency(desc, beanName, autowiredBeanNames, (TypeConverter)converter);
                    if (autowiredArgument != null) {
                        pvs.add(propertyName, autowiredArgument);
                    }

                    Iterator var17 = autowiredBeanNames.iterator();

                    while(var17.hasNext()) {
                        String autowiredBeanName = (String)var17.next();
                        this.registerDependentBean(autowiredBeanName, beanName);
                        if (this.logger.isDebugEnabled()) {
                            this.logger.debug("Autowiring by type from bean name '" + beanName + "' via property '" + propertyName + "' to bean named '" + autowiredBeanName + "'");
                        }
                    }

                    autowiredBeanNames.clear();
                }
            } catch (BeansException var19) {
                throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, var19);
            }
        }

    }


找到这个方法中catch异常的地方:
在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 中出什么错,都是类似的异常信息,一般都是 XML 解析出的错。

还有一个问题,为什么出错后只能看到无限输出的一行日志,而看不到这里具体的异常信息呢?
通过追踪代码,发现在org.springframework.beans.factory.support.AbstractBeanFactory类中的方法:

protected Class<?> getTypeForFactoryBean(final FactoryBean<?> factoryBean) {
        try {
            return System.getSecurityManager() != null ? (Class)AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
                public Class<?> run() {
                    return factoryBean.getObjectType();
                }
            }, this.getAccessControlContext()) : factoryBean.getObjectType();
        } catch (Throwable var3) {
            this.logger.warn("FactoryBean threw exception from getObjectType, despite the contract saying that it should return null if the type of its object cannot be determined yet", var3);
            return null;
        }
    }


这里捕获异常后,直接return null导致异常被吞。

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

è¿éåå¾çæè¿°

原文:https://blog.csdn.net/isea533/article/details/51277786 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
单片微型计算机(MCU)经过多年的发展,在性能上有很大的进步,在型号上发展到上千种类,已经广泛应用于人类社会生活的各个领域。单片机课程已经成为高校计算机、自动化、测控以及电子信息工程等专业的重要课程。该课程是一门理论性和实践性都很强的课程,在实际教学中,应将理论教学和实验教学紧密结合。学生在掌握理论知识之余,必须通过编写程序、设计硬件电路、仿真、调试这一系列的实验过程,才能更好地掌握单片机的结构原理和应用技能。随着单片机及其接口技术的飞速发展,目前市场上供应的编程仿真实验资源并不能完全满足高校单片机课程教与学的需求,构建低成本、技术先进、源码公开的单片机编程仿真实验系统,对我国单片机课程的教学和单片机领域人才的培养具有重要的现实意义。 本论文结合目前教学中对单片机编程仿真实验系统的实际需求,采用模块化结构设计思想,精心设计和开发了单片机编程仿真实验系统。该单片机编程仿真实验系统由PC机端单片机编程控制软件和单片机编程仿真实验板两部分组成。PC机端的单片机编程控制软件可以自动检测到连接到单片机编程仿真实验板上的单片机,控制单片机编程器擦除、写入、读出、校验目标单片机ROM中的程序,以十六进制文件(.HEX文件)格式显示在控制界面内;单片机仿真实验系统能够把写入单片机的程序实时地运行,并呈现实际运行效果。单片机编程控制软件和单片机仿真实验板组成一个完整的单片机编程仿真实验系统。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值