在 Java 中,"~[classes/:?]"字符串(或类似的字符串,如 ~[?:?])何时出现在堆栈跟踪行的末尾?



我有一个由Java 8.0开发并部署在Tomcat 8.0上的Web应用程序。在某些情况下,我遇到一个我不熟悉的字符串错误。例如,在我的一种情况下,我遇到了与以下相同的错误:

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,但我仍然收到此错误。 有人有任何想法或建议吗?

对于现成的 Java 来说,这不是正常行为。 因此,我们必须得出结论,这些堆栈跟踪不是由您的代码调用生成的Throwable::printStacktrace()

经过一些挖掘后,一个可能的原因是您使用 Logback 进行日志记录,特别是以PatternLayout模式使用%xThrowable而不是%throwable。 这包括堆栈跟踪中的额外打包信息以及您看到的语法。 有关更多详细信息,您应该参考 Logback 文档,因为模式语言中可能有许多变体。

文档还说:

请注意,鉴于其潜在成本,默认情况下禁用包装数据的计算。启用打包数据的计算后,PatternLayout将自动采用%xThrowable后缀,而不是模式字符串末尾%throwable

后缀。

因此,后缀可能是这样做的副作用:

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

在日志配置中。


更新:你说你使用的是Log4j2而不是Logback。

Log4j2 具有等效的基于模式的日志记录布局,支持%xThrowable;请参阅 https://logging.apache.org/log4j/2.x/manual/layouts.html

请注意,此字符串出现在某些堆栈跟踪中,而不是全部。

如果您的应用程序或您正在使用的某些第三方库在某些情况下直接调用Throwable::printStacktrace或类似库,并在其他情况下通过记录器生成堆栈跟踪,则可以解释这一点。

相关内容

最新更新