如何以不同的方式处理Spring MVC中HTML和JSON请求的异常

2022-09-01 10:00:06

我在Spring 4.0.3中使用以下异常处理程序来拦截异常并向用户显示自定义错误页面:

@ControllerAdvice
public class ExceptionHandlerController
{
    @ExceptionHandler(value = Exception.class)
    public ModelAndView handleError(HttpServletRequest request, Exception e)
    {
        ModelAndView mav = new ModelAndView("/errors/500"));
        mav.addObject("exception", e);
        return mav;
    }
}

但现在我想要对JSON请求进行不同的处理,以便在发生异常时获得此类请求的JSON错误响应。目前,上述代码也是由JSON请求(使用标头)触发的,JavaScript客户端不喜欢HTML响应。Accept: application/json

如何以不同的方式处理 HTML 和 JSON 请求的异常?


答案 1

ControllerAdvice 注释有一个名为 basePackage 的元素/属性,可以设置该元素/属性来确定它应该扫描哪些包以查找控制器并应用建议。因此,您可以做的是将处理正常请求的控制器和处理 AJAX 请求的控制器分离到不同的包中,然后编写 2 个异常处理控制器,其中包含适当的 ControllerAdvice 注释。例如:

@ControllerAdvice("com.acme.webapp.ajaxcontrollers")
public class AjaxExceptionHandlingController {
...
@ControllerAdvice("com.acme.webapp.controllers")
public class ExceptionHandlingController {

答案 2

执行此操作的最佳方法(特别是在 servlet 3 中)是在容器中注册一个错误页面,并使用它来调用 Spring 。通过这种方式,您可以以标准的Spring MVC方式处理不同的响应类型(例如,使用duces=...用于您的计算机客户端)。@Controller@RequestMapping

我从你的另一个问题中看到你正在使用Spring Boot。如果升级到快照(换句话说,1.1 或更高版本),则会开箱即用地获得此行为(请参阅 BasicErrorController)。如果要覆盖它,只需将 /error 路径映射到您自己的 .@Controller


推荐