如何让 Guice 的报错在 Tomcat 中正常显示?

20-Dec-2019 10:33:58.799 信息 [AsyncFileHandlerWriter-1596000437] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此Web应用程序实例已停止。无法加载[com.google.inject.internal.util.LineNumbers$LineNumberReader]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
    java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[com.google.inject.internal.util.LineNumbers$LineNumberReader]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1373)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1226)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
        at com.google.inject.internal.util.StackTraceElements$1.load(StackTraceElements.java:49)
        at com.google.inject.internal.util.StackTraceElements$1.load(StackTraceElements.java:45)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3953)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3976)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4960)
        at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4966)
        at com.google.inject.internal.util.StackTraceElements.forMember(StackTraceElements.java:71)
        at com.google.inject.internal.Messages.formatSource(Messages.java:241)
        at com.google.inject.internal.Messages.formatSource(Messages.java:220)
        at com.google.inject.internal.Messages.formatInjectionPoint(Messages.java:276)
        at com.google.inject.internal.Messages.formatSource(Messages.java:235)
        at com.google.inject.internal.Messages.formatSource(Messages.java:220)
        at com.google.inject.internal.Messages.formatMessages(Messages.java:90)
        at com.google.inject.ProvisionException.getMessage(ProvisionException.java:61)
        at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:396)
        at java.base/java.lang.Throwable.toString(Throwable.java:495)
        at java.base/java.lang.String.valueOf(String.java:3042)
        at java.base/java.io.PrintWriter.println(PrintWriter.java:837)
        at org.apache.juli.OneLineFormatter$IndentingPrintWriter.println(OneLineFormatter.java:250)
        at java.base/java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:778)
        at java.base/java.lang.Throwable.printStackTrace(Throwable.java:669)
        at java.base/java.lang.Throwable.printStackTrace(Throwable.java:735)
        at org.apache.juli.OneLineFormatter.format(OneLineFormatter.java:150)

看起来是 Guice 报错导致我的程序结束,但是报错信息是在 Tomcat 禁止访问之后才抵达,然后看不到报错信息。
该怎么做才能看到报错信息呢?

排除法确定是,这个构造函数的注入有问题,注释掉这个构造函数就不会崩溃了

private final UserService userService;  
  
@Inject  
public UserApiServlet(UserService userService) {  
    this.userService = userService;  
}

Guice: 4.2.2
Tomcat: 9.0.30
Java: 12.0.2

阅读 1.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题