Spring MVC:处理Ajax请求和正常请求异常的最佳方法是什么?

时间:2015-04-13 07:40:46

标签: 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 ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", request.getRequestURL());
    mav.setViewName(ViewConstants.INTERNAL_ERROR_VIEW);
    return mav;
}

它将返回一个常见的错误页面。这对于正常的请求异常非常有用。但如果这是一个Ajax请求,结果是如此丑陋。所以我添加代码来判断它。添加的代码如下:

if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
        // return HTTP Status code and response message
    } else {
        // return error page name
    }

我不认为这是最好的方式,任何人都有好的意见吗?

4 个答案:

答案 0 :(得分:1)

我将所有控制器都放在不同的包中,具体取决于它们是否提供AJAX请求。然后我可以在ControllerAdvice注释上设置#basePackages元素来相应地处理异常

<强>更新 请参阅RequestMapping#paramsRequestMapping#headers,根据标题和/或参数

分隔控制器

答案 1 :(得分:0)

我建议在任何请求上设置错误响应代码,认为这是一个很好的做法,通知客户端出现问题,而不是取决于请求的类型。对于ajax请求,您可以返回相同的页面并通过错误代码识别问题。

答案 2 :(得分:0)

如果使用jQuery发出请求,可以使用以下命令:

jQuery.ajaxSetup({
    headers: { 'ajax-request': true },
    statusCode: {
        400: function (xhr) {
            ...do something
        },
        500: function (xhr) {
            ...do something
        }
        ...
    }
});

答案 3 :(得分:0)

...
public class Application extends SpringBootServletInitializer {

@Bean(name = "simpleMappingExceptionResolver")
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
    SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
    r.setDefaultErrorView("forward:/errorController");
    return r;
}
@Controller
public class ErrorController {

    public static final Logger LOG = Logger.getLogger(ErrorController.class);

    @RequestMapping(value = "/errorController")
    public ModelAndView handleError(HttpServletRequest request,
            @RequestAttribute("exception") Throwable th) {

        ModelAndView mv = null;
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            if (isBusinessException(th)) {
                mv = new ModelAndView("appAjaxBadRequest");
                mv.setStatus(BAD_REQUEST);
            } else {
                LOG.error("Internal server error while processing AJAX call.", th);
                mv = new ModelAndView("appAjaxInternalServerError");
                mv.setStatus(INTERNAL_SERVER_ERROR);
            }
            mv.addObject("message", getUserFriendlyErrorMessage(th).replaceAll("\r?\n", "<br/>"));
        } else {
            LOG.error("Cannot process http request.", th);
            mv = new ModelAndView("appErrorPage");
            mv.addObject("exeption", th);
        }

        return mv;
    }
}