Java SpringMVC:处理Ajax请求和普通请求异常的最佳方法?
我想在我的项目中定义一个常见的异常管理器,所以我使用@ControllerAdvice,代码片段如下:Java SpringMVC:处理Ajax请求和普通请求异常的最佳方法?,java,ajax,spring,spring-mvc,Java,Ajax,Spring,Spring Mvc,我想在我的项目中定义一个常见的异常管理器,所以我使用@ControllerAdvice,代码片段如下: @ExceptionHandler(Exception.class) public ModelAndView handleAllException(HttpServletRequest request, Exception ex) throws Exception { LOGGER.error(ex.getMessage()); ModelAndView mav = new
@ExceptionHandler(Exception.class)
public ModelAndView handleAllException(HttpServletRequest request, Exception ex) throws Exception
{
LOGGER.error(ex.getMessage());
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", request.getRequestURL());
mav.setViewName(ViewConstants.INTERNAL_ERROR_VIEW);
return mav;
}
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// return HTTP Status code and response message
} else {
// return error page name
}
它将返回一个常见错误页面。这对于请求的正常异常非常好。但是,如果这是一个Ajax请求,那么结果会非常糟糕。所以我添加了代码来判断它。新增代码如下:
@ExceptionHandler(Exception.class)
public ModelAndView handleAllException(HttpServletRequest request, Exception ex) throws Exception
{
LOGGER.error(ex.getMessage());
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", request.getRequestURL());
mav.setViewName(ViewConstants.INTERNAL_ERROR_VIEW);
return mav;
}
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// return HTTP Status code and response message
} else {
// return error page name
}
我不认为这是最好的方法,有人有好的意见吗?我建议在任何请求上设置错误响应代码,我认为这是一种很好的做法,可以通知客户出现问题,而不取决于请求的类型。对于ajax请求,您可以返回相同的页面并通过错误代码识别问题。如果使用jQuery进行请求,您可以使用以下命令:
jQuery.ajaxSetup({
headers: { 'ajax-request': true },
statusCode: {
400: function (xhr) {
...do something
},
500: function (xhr) {
...do something
}
...
}
});
我的所有控制器都在不同的包中,这取决于它们是否服务于AJAX请求。然后我可以在ControllerAdvice注释上设置元素来相应地处理异常 更新: 请参阅和,以根据标头和/或参数分离控制器
...
public class Application extends SpringBootServletInitializer {
@Bean(name = "simpleMappingExceptionResolver")
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
r.setDefaultErrorView("forward:/errorController");
return r;
}
@控制器
公共类错误控制器{
公共静态最终记录器LOG=Logger.getLogger(ErrorController.class);
@请求映射(value=“/errorController”)
公共模型和视图句柄错误(HttpServletRequest,
@RequestAttribute(“异常”)可丢弃(th){
ModelAndView mv=null;
if(“XMLHttpRequest”.equals(request.getHeader(“X-request-With”)){
if(isBusinessException(th)){
mv=新模型和视图(“appAjaxBadRequest”);
mv.设置状态(错误请求);
}否则{
error(“处理AJAX调用时出现内部服务器错误。”,th);
mv=新模型和视图(“appAjaxInternalServerError”);
mv.setStatus(内部服务器错误);
}
mv.addObject(“message”,getUserFriendlyErrorMessage(th).replaceAll(“\r?\n”,“
”));
}否则{
LOG.error(“无法处理http请求。”,th);
mv=新模型和视图(“appErrorPage”);
mv.addObject(“execption”,th);
}
返回mv;
}
}
这可能就是解决问题的方法。