【发布时间】:2013-01-23 19:58:24
【问题描述】:
使用 Spring,我有一个 SimpleMappingExceptionResolver,它可以在 resolveException 方法中捕获我的应用程序中的任何意外异常。在该方法中,我返回一个 ModelAndView,它将错误消息文本返回给 HTTP 客户端。代码如下:
public class UnExpectedExceptionResolver extends SimpleMappingExceptionResolver {
private Log logger = LogFactory.getLog(this.getClass().getName());
private ResourceBundleMessageSource messageSource;
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
// let the end user know that an error occurred
Locale locale = RequestContextUtils.getLocale(request);
String messageText = messageSource.getMessage("systemError", null, locale);
Message message = new Message(messageText, MessageType.ERROR);
ModelAndView mav = new ModelAndView();
mav.setView(new MappingJacksonJsonView());
mav.addObject("message", message);
return mav;
}
因此,响应返回的 HTTP 状态代码为 200,响应文本为消息 (JSON)。不幸的是,由于 200 代码,客户认为这是一个有效的响应,并尝试对其进行处理。我尝试将 HTTP 状态代码设置为 500,如下所示:
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error");
就在
之前 return mav;
声明。不幸的是,这会返回一个指示内部错误的 HTML 页面,而不是我的 JSON 消息。如何返回 JSON 消息并仍然向客户端指示服务器错误(或某种类型的错误)?具体来说,我希望调用 AJAX 调用中客户端的错误函数,并且仍然将消息数据发送回客户端。仅供参考 - 我在客户端使用 jQuery。
【问题讨论】:
-
您使用的是哪个版本的 Spring?这很重要:Spring 3.1+ 似乎支持
@ResponseBody,如果你只想要响应状态,你可以抛出一个用@ResponseStatus装饰的异常。如果你幸运并且使用 Spring 3.2,你可以返回 ResponseEntity。 -
我使用的是 Spring 3.0.5。它支持@ResponseBody。
-
是的,但不在 '@ExceptionHandler' 注释方法中。恕我直言,您应该考虑切换到 Spring 3.2。如果有什么好的技术,那么 Spring 团队不会引入带有控制器建议的新异常处理程序。
-
感谢您的建议。我已经切换到 Spring 3.2。我查看了您的“ResponseEntity”和“@ResponseBody”链接(以及下面的答案)。看来我必须将异常处理程序方法放在每个控制器中。如何使用 ResponseEntity 以使异常处理程序存在于一个类中并像 SimpleMappingExceptionResolver 一样从所有控制器中捕获任何意外异常?如果您可以使用 Spring 3.2 提供答案,将不胜感激。
标签: jquery ajax spring exception http-status-codes