使用Spring,我有一个SimpleMappingExceptionResolver,它在resolveException方法中捕获我的应用程序中的任何意外异常。在该方法中,我返回一个ModelAndView,它将错误消息文本返回给HTTP客户端。下面的代码:如何返回调用jQuery AJAX错误函数的错误消息和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;
}
这样,响应被返回为200的HTTP状态代码与响应文本为消息(JSON)。不幸的是,客户认为这是一个有效的回应,因为200代码,并试图处理它。在
return mav;
语句之前
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error");
:我尝试设置HTTP状态代码500,如下所示。不幸的是,这返回一个HTML页面,指示一个内部错误,而不是我的JSON消息。我怎样才能返回JSON消息,并仍然向客户端指出服务器错误(或某种类型的错误)?具体来说,我期望调用AJAX调用中的客户端错误函数,并将消息数据发送回客户端。仅供参考 - 我在客户端使用jQuery。
是否使用的是春天的版本?这是至关重要的:如果你只想要响应,Spring 3.1+似乎支持['@ ResponseBody'](http://stackoverflow.com/questions/5097134/spring-exceptionhandler-does-not-work-with-responsebody)状态,你可以抛出一个用'@ ResponseStatus'装饰的异常。如果你很幸运并且使用Spring 3.2,你可以返回[ResponseEntity](http://stackoverflow.com/questions/14247126/spring-mvc-controller-null-return-handler)。 –
我使用Spring 3.0.5。它支持@ResponseBody。 – James
是的,但不是在'@ExceptionHandler'注释的方法。 Imho你应该考虑切换到Spring 3.2。如果有任何好的技术,那么Spring团队不会引入新的异常处理程序和控制器建议。 –