【问题标题】:How to see nested exceptions trace, hidden by Spring?如何查看被 Spring 隐藏的嵌套异常跟踪?
【发布时间】:2012-10-23 03:38:13
【问题描述】:

当我在 Eclipse 中调试 Spring 应用程序时,我得到了很长的异常链。例如,我有

创建文件 [...Tester.xml] 中定义的名称为“...”的 bean 时出错:设置属性值时出错;嵌套异常是 org.springframework.beans.PropertyBatchUpdateException;嵌套的 PropertyAccessExceptions (1) 是: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property '...' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException: ...

等等。 Spring内部的多个堆栈异常,这很无趣。下面应该是我的例外,但 Spring 没有显示它们。

而且我无法像往常一样单击异常并导航到问题位置。

Spring如何输出所有异常?

更新

以下是完整的输出。可以看到IllegalArgumentException出现的地方很可能被截断了。

线程“主”org.springframework.beans.factory.BeanCreationException 中的异常:创建文件 [D:\mypath\myconfig.xml] 中定义的名称为“mybean”的 bean 时出错:设置属性值时出错;嵌套异常是 org.springframework.beans.PropertyBatchUpdateException;嵌套的 PropertyAccessExceptions (1) 是: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'myproperty' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException:我的异常消息 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 在 org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:140) 在 org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:84) 在 springtests.SpringRunner.main(SpringRunner.java:8) 引起:org.springframework.beans.PropertyBatchUpdateException;嵌套的 PropertyAccessExceptions (1) 是: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'target.partner' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException: Illegal frame length 1 in显式构造函数 在 org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) 在 org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) ... 13 更多

【问题讨论】:

  • 它没有截断异常。这就是嵌套异常时得到的结果。
  • 是的,这些是嵌套异常。如何让它们全部显示?
  • 它们显示出来了。不过,读取堆栈跟踪可能会令人困惑。看看docs.oracle.com/javase/6/docs/api/java/lang/…
  • 我发布了完整的输出。 IllegalArgumentException 在我的二传手中。如果您确定所有例外情况都存在,请在列表中找到它吗?
  • 啊!你说得很对。因为 Spring 试图一次设置一组属性,所以它把嵌套的异常聚集在一起。

标签: eclipse spring debugging exception output


【解决方案1】:

由于可能存在多个异常,因此您需要捕获 PropertyBatchUpdateException 并调用 getPropertyAccessExceptions() 以检查特定异常的堆栈跟踪。

编辑

其实我不太清楚这里发生了什么

这里是PropertyBatchUpdateExceptionprintStackTrace方法:

public void printStackTrace(PrintWriter pw) {
        synchronized (pw) {
            pw.println(getClass().getName() + "; nested PropertyAccessException details (" +
                    getExceptionCount() + ") are:");
            for (int i = 0; i < this.propertyAccessExceptions.length; i++) {
                pw.println("PropertyAccessException " + (i + 1) + ":");
                this.propertyAccessExceptions[i].printStackTrace(pw);
            }
        }
    }

它应该包括嵌套的堆栈跟踪。您使用的是最新版本的 Spring 吗?

编辑:

我能建议的最好方法是在调试模式下运行,然后在AbstractAutowireCapableBeanFactory.java:1361 处设置一个断点,看看发生了什么。

【讨论】:

  • 可能有一些 Spring 配置可能使它只显示它拥有的所有内容?
  • 您是否将 Spring 的日志记录配置设置为 DEBUG?
  • 我不知道。我在类路径中有自己的log4.properties 文件,log4j.rootLogger=DEBUG, A1
  • @Dims 当您启动它时,您是否在调试级别看到大量 Spring 日志记录?
  • 啊,是的,我看到标记为 DEBUG 的消息来自 Spring。
猜你喜欢
  • 1970-01-01
  • 2011-12-14
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2020-09-14
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多