使用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團隊不會引入新的異常處理程序和控制器建議。 –