Когда строка «~ [classes / :?]» (или аналогичная, например ~ [?:?]) Появляется в конце строк трассировки стека в Java? - PullRequest
2 голосов
/ 22 июня 2019

У меня есть веб-приложение, которое разработано на Java 8.0 и развернуто на Tomcat 8.0.В некоторых случаях у меня возникает ошибка со строкой, с которой я не знаком.Например, у меня есть ошибка, аналогичная приведенной ниже, в одном из моих сценариев:

Caused by: java.lang.IllegalArgumentException
    at sun.reflect.GeneratedMethodAccessor6555.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_102]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_102]
    at org.hibernate.property.access.spi.SetterMethodImpl.set(SetterMethodImpl.java:44) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:649) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:205) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4745) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:189) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:128) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1152) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.processResultSet(Loader.java:1011) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:949) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2692) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2675) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2502) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at sun.reflect.GeneratedMethodAccessor8215.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_102]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_102]
    ... 64 more

Я переустановил Java и Tomcat, но все еще получаю эту ошибку.У кого-нибудь есть идеи или предложения?

1 Ответ

2 голосов
/ 23 июня 2019

Это не нормальное поведение для готовой Java. Поэтому мы должны сделать вывод, что эти стековые трассы не генерируются вашим кодом, вызывающим Throwable::printStacktrace()

После небольшого копания, одной из возможных причин является то, что вы используете Logback для ведения журнала и, в частности, используете %xThrowable, а не %throwable в шаблоне PatternLayout. Это включает в себя дополнительную информацию об упаковке в трассировке стека с синтаксисом, который вы видите. Вам следует обратиться к документации Logback для получения более подробной информации, поскольку в языке шаблонов возможны различные варианты.

В документации также сказано:

Обратите внимание, что с учетом его потенциальной стоимости вычисление данных упаковки по умолчанию отключено. Когда включено вычисление данных упаковки, PatternLayout автоматически примет суффикс %xThrowable вместо суффикса %throwable в конце строки шаблона .

Таким образом, суффиксы могут быть побочным эффектом этого:

 <configuration packagingData="true">
    ...
 </configuration>

в конфигурации Logback.


ОБНОВЛЕНИЕ : Вы сказали, что используете Log4j2 вместо Logback.

Log4j2 имеет эквивалентную схему ведения журнала на основе шаблонов с поддержкой %xThrowable; см https://logging.apache.org/log4j/2.x/manual/layouts.html

Обратите внимание, что эта строка появляется в некоторых трассировках стека, но не во всем этом.

Это можно объяснить, если ваше приложение или некоторые сторонние библиотеки, которые вы используете, в некоторых случаях вызывают Throwable::printStacktrace или аналогичные напрямую и генерируют трассировки стека с помощью регистратора в других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...