我目前正在开发一个现有系统,其中我必须为整个系统创建一般错误处理。该系统使用的是Spring MVC和AJAX。
现在我已经完成了正常请求的错误处理(不使用ajax) 但是我遇到了AJAX部分的问题。在AJAX部分中,如果存在错误/异常,则页面不会重定向到我创建的通用错误页面。它停留在同一个屏幕上,没有任何反应。
我已经完成了对此的研究,似乎对于AJAX部分,我需要通过jQuery重定向来完成。
由于我正在使用现有系统,因此我希望尽量减少要进行的更改。所以我的问题是: 是否可以创建一个AJAX部分可以自动调用的通用方法,而无需在AJAX调用的'error:'部分添加额外的代码?
任何建议都会很乐意接受。 :d
答案 0 :(得分:1)
您可以注册ajaxError
个活动。这是jQuery的documentation。
代码示例:
$( document ).ajaxError(function() {
//do your redirect(s) here
});
请注意,我想简单地显示使用它的要点,但您也可以获取哪个jqXHR
对象引发错误/重新路由,具体取决于它是哪一个。
答案 1 :(得分:0)
从我的应用程序中查看以下工作示例。
我的 ExceptionController
@ExceptionHandler(Exception.class)
public ModelAndView getExceptionPage(Exception e, HttpServletRequest request) {
BaseLoggers.exceptionLogger.error("Exception in Controller", e);
if (isAjax(request)) {
ModelAndView model = new ModelAndView("forward:/app/webExceptionHandler/ajaxErrorRedirectPage");
request.setAttribute("errorMessageObject", e.toString());
return model;
} else {
ModelAndView model = new ModelAndView("forward:/app/webExceptionHandler/nonAjaxErrorRedirectPage");
request.setAttribute("errorMessageObject", e.toString());
request.setAttribute("errorViewName", "error");
return model;
}
}
// AnotherController 转发请求的地方。
// this mapping is responsible for rendering view for all exceptions in nonAjax calls.
@RequestMapping(value = "/nonAjaxErrorRedirectPage")
public String nonAjaxErrorRedirectPage(HttpServletRequest request, Model model) {
Locale loc = RequestContextUtils.getLocale(request);
String nonAjaxErrorMsg = messageSource.getMessage("label.error.msg.nonAjaxCalls", null, loc);
model.addAttribute("errorMessage", nonAjaxErrorMsg);
String errorViewName = (String) request.getAttribute("errorViewName");
return errorViewName;
}
// this mapping is responsible for sending error message with suitable error code for all exceptions in Ajax calls.
@RequestMapping(value = "/ajaxErrorRedirectPage")
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public String ajaxErrorRedirectPage(HttpServletRequest request, Model model) {
Locale loc = RequestContextUtils.getLocale(request);
String ajaxErrorMsg = messageSource.getMessage("label.error.msg.ajaxCalls", null, loc);
return ajaxErrorMsg;
}