Java SpringMVC:处理Ajax请求和普通请求异常的最佳方法?

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

我想在我的项目中定义一个常见的异常管理器,所以我使用@ControllerAdvice,代码片段如下:

@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; } }
这可能就是解决问题的方法。