RESTEasy隐藏了真正的异常

时间:2011-03-31 19:32:51

标签: java resteasy

我的代码抛出异常(由于错误)。在日志中,我看到:

org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:323)
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:199)
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:175)
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:529)
    etc...

未记录实际异常的堆栈。如果我将代码包装在try..catch中并记录捕获的异常,我可以验证我的代码是否有错。我的系统中没有其他库可以做到这一点,即使对于深度包装的异常,所以它一定是RESTEasy中的一个问题,可能在UnhandledException中?

有没有办法绕过这种行为?我想不出它应该隐藏实际异常的一个很好的理由。

  • 码头
  • 爪哇
  • Spring 3.0.3
  • RESTEasy 2.0.1GA

3 个答案:

答案 0 :(得分:1)

你有ExceptionMapper吗?请参阅RESTEasy文档中的第27章“异常处理”。

我使用RESTEasy将REST添加到现有系统中,而现有系统有一种奇怪的方法来包含异常中的异常,因此我的ExceptionMappers会进行大量的解包。

Throwable t = exception;
while (t.getCause() != null) {
  t = t.getCause();
}
t.printStackTrace();

答案 1 :(得分:0)

我不使用RESTeasy,但它似乎是RESTful Web服务的调度机制。

假设是这种情况,那么它与其他库有不同的设计目标:它们是从您的应用程序调用的,但RESTeasy负责调用您的应用程序。因此,它必须保护自己免受编写不良的代码。 “最后沟渠”异常处理程序是执行此操作的常用方法;你会在Swing中看到同样的事情。

是否应记录未捕获的异常是另一回事。也许有一个配置选项来做到这一点。或者您可能需要添加几行代码。毕竟,它是开源的,我确信维护人员会很喜欢带有补丁的精心编写的错误报告。

答案 2 :(得分:0)

是的,您的异常被RESTeasy吞噬,包含在UnhandledException中并被记录。但你的例外情况太深入,无法包含在stacktrac中。

要将您的异常打印到控制台,您可以将以下内容附加到'WEB-INF / classes / logging.properties'

org.apache.catalina.core.ContainerBase.[Catalina].level = FINEST
org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler