Spring ExceptionHandler返回500内部错误

时间:2014-01-31 03:39:01

标签: java rest spring-mvc exception-handling

我正在使用Spring 3.4.0开发RESTful服务器。我有几个API工作。现在我正在添加错误处理。我从Controller类中的基本@ExceptionHandler开始。

我创建了一个自己的APIException类:     public class APIException extends RuntimeException

我创建了一个ErrorInfo类。

最后在我的控制器中添加了handleAPIException方法。这里的值是硬编码的。一旦这个工作,我会改变它:

@ExceptionHandler(APIException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorInfo handleAPIException(APIException e) {
    ErrorInfo errorInfo = new ErrorInfo();
    errorInfo.setCode(3344);
    errorInfo.setStatus(HttpStatus.BAD_REQUEST.value());
    errorInfo.setMessage("test message!");
    errorInfo.setDeveloperMessage("test developer message!");
    errorInfo.setMoreInfo("no more info");
    errorInfo.setRequestId("testrequest123");

    return errorInfo;
}

现在当我运行它并逐步使用调试器时,它确实可以使用此函数并且此函数一直执行直到结束。但是在客户端,我得到以下html响应,而不是ErrorInfo的json表示。我尝试将handleAPIException响应更改为ModelAndView而不是ErrorInfo,但这也无济于事。

Apache Tomcat / 7.0.47 - 错误报告

HTTP状态500 - 请求处理失败;嵌套异常是co.company.here.exception.APIException

类型异常报告

消息请求处理失败;嵌套异常是co.company.here.exception.APIException

description 服务器遇到内部错误,导致无法完成此请求。

例外

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is co.company.here.exception.APIException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

根本原因

co.company.here.exception.APIException
    co.company.here.controller.BusinessController.createBusiness(BusinessController.java:114)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

注意 Apache Tomcat / 7.0.47日志中提供了根本原因的完整堆栈跟踪。

Apache Tomcat / 7.0.47

0 个答案:

没有答案