RESTful服务 - 避免堆栈跟踪到客户端

时间:2014-08-30 16:08:10

标签: java spring tomcat cxf

我正在使用java开发一个restful webservices。我正在处理所有运行时和其他可能的异常情况,以向客户端发送有意义的响应。

当出现内存不足的情况时,如何确保客户端从服务器获得有意义的响应?

使用CXF和ExceptionMapper。

4 个答案:

答案 0 :(得分:1)

在Spring中,您可以捕获异常并将它们映射到有意义的HTTP状态代码。以下代码可能适合您(将YourException映射到HTTP 500):

@ControllerAdvice
public class ExceptionProcessor {

  @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
  @ExceptionHandler({YourException.class})
  public void serverError(HttpServletRequest req, Exception exception) {
    // ...
    // Print exception to server log
    exception.printStackTrace();
  }
}

答案 1 :(得分:0)

这不是例外;这是一个错误:java.lang.OutOfMemoryError

您可以从Throwable下载时抓住它:

try {
    // create lots of objects here and stash them somewhere
} catch (OutOfMemoryError E) {
    // release some (all) of the above objects
}

但是,除非你做了一些相当具体的事情(比如在特定的代码部分中分配大量的东西),否则你可能无法抓住它,因为你不知道它会被扔到哪里从

如果您的问题的根本原因是内存泄漏,那么从OOM捕获和恢复的可能性将无法回收泄漏的内存。您的应用程序将再次持续一段时间,然后再次,并且再次以不断减少的间隔继续运行。

当你专门分配一些可能太大的东西时,可能至少有一次抓住OutOfMemoryError的好时机:

答案 2 :(得分:0)

OutOfMemoryError的问题在于它可能发生在任何线程中,包括不运行REST服务代码的线程。在服务器环境中,捕获任何Error被认为是一种不好的做法。你应该让它冒泡调用堆栈,由服务器代码处理。

不要抓住它,最好调查内存耗尽并解决原因的原因。可能是您的服务器根本没有分配足够的内存,或者您在某处有内存泄漏。您需要分析问题,例如通过分析生成的堆转储,并确保它不再发生。

在像Java EE服务器这样的托管环境中,假设您可以通过捕获它来从OutOfMemeoryError中恢复,这是危险的并且通常是错误的。大多数情况下,你甚至无法抓住它,因为它发生在你无法控制的线索中。

答案 3 :(得分:0)

我正在使用HandlerExceptionResolver:

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {

    @Override
    @ExceptionHandler(value = Exception.class)
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse     response, Object handler, Exception ex) {
          Your error processing goes here
    }
}

因此,每个异常都在resolveException中,并且我将相应的消息(在我的情况下为JSON)写入响应。

还有一篇好文章http://www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example