Как увидеть трассировку вложенных исключений, скрытых Spring?

Когда я отлаживаю приложение Spring в Eclipse, я получаю длинные цепочки исключений. Например, у меня есть

Error creating bean with name '...' defined in file [...Tester.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property '...' threw exception; nested exception is java.lang.IllegalArgumentException: ...

И так далее. Множественные стеки с исключениями внутри Spring, что неинтересно. Это должны быть мои исключения где-то ниже, но Spring их не показывает.

И я не могу щелкнуть по исключению и, как обычно, перейти к проблемному месту.

Как сказать Spring для вывода всех исключений?

ОБНОВЛЕНИЕ

Ниже приведен полный вывод. Видно, что место, где произошло IllegalArgumentException, вероятно, усечено.

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mybean' defined in file [D:\mypath\myconfig.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'myproperty' threw exception; nested exception is java.lang.IllegalArgumentException: my exception message
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:140)
    at org.springframework.context.support.FileSystemXmlApplicationContext.(FileSystemXmlApplicationContext.java:84)
    at springtests.SpringRunner.main(SpringRunner.java:8)
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'target.partner' threw exception; nested exception is java.lang.IllegalArgumentException: Illegal frame length 1 in explicit constructor
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)
    ... 13 more

person Dims    schedule 02.11.2012    source источник
comment
Это не усечение исключения. Это то, что вы получаете, когда у вас есть вложенные исключения.   -  person artbristol    schedule 02.11.2012
comment
Да, это вложенные исключения. Как их все отобразить?   -  person Dims    schedule 02.11.2012
comment
Все они отображаются. Однако чтение трассировки стека может сбивать с толку. Просмотрите документы . oracle.com/javase/6/docs/api/java/lang/   -  person artbristol    schedule 02.11.2012
comment
Я выложил полный вывод. IllegalArgumentException был в моем сеттере. Можете ли вы найти его в списке, если вы уверены, что есть все исключения?   -  person Dims    schedule 02.11.2012
comment
Ах! Вы совершенно правы. Поскольку Spring пытается установить сразу несколько свойств, он группирует вложенные исключения.   -  person artbristol    schedule 02.11.2012
comment
Здорово! Итак, остается вопрос: как увидеть эти скрытые исключения?   -  person Dims    schedule 02.11.2012
comment
Кстати, это не я проголосовал за вас :-)   -  person artbristol    schedule 02.11.2012
comment
Я знаю, что люди начинают с отрицательных голосов   -  person Dims    schedule 02.11.2012


Ответы (1)


Поскольку существует потенциально несколько исключений, вам необходимо перехватить PropertyBatchUpdateException и вызвать getPropertyAccessExceptions(), чтобы проверить трассировку стека для конкретного исключения.

Редактировать

На самом деле я не совсем уверен, что здесь происходит

Вот метод printStackTrace PropertyBatchUpdateException:

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 и посмотреть, что происходит.

person artbristol    schedule 02.11.2012
comment
Может быть, есть какие-то конфиги Spring, которые могут заставить его просто отображать все, что у него есть? - person Dims; 02.11.2012
comment
Вы установили конфигурацию ведения журнала Spring на DEBUG? - person artbristol; 02.11.2012
comment
Я не знаю. У меня есть собственный log4.properties файл в пути к классам с log4j.rootLogger=DEBUG, A1. - person Dims; 02.11.2012
comment
@Dims Вы видите загрузку журналов Spring на уровне отладки при запуске? - person artbristol; 02.11.2012
comment
Ах да, я вижу сообщения с пометкой DEBUG от Spring. - person Dims; 02.11.2012