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

kay*_*ahr 30 java spring spring-mvc jackson

我在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

dna*_*ang 12

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

@ControllerAdvice("com.acme.webapp.ajaxcontrollers")
public class AjaxExceptionHandlingController {
...
@ControllerAdvice("com.acme.webapp.controllers")
public class ExceptionHandlingController {
Run Code Online (Sandbox Code Playgroud)


Dav*_*yer 8

执行此操作的最佳方法(尤其是在servlet 3中)是使用容器注册错误页面,并使用它来调用Spring @Controller.这样您就可以以标准的Spring MVC方式处理不同的响应类型(例如@RequestMapping,对于您的机器客户端使用produce = ...).

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


Mar*_*rey 0

从 spring 4 开始,controlleradvice 注释有多个可以设置的属性。您可以应用不同的规则定义多个控制器建议。

其中一个属性是“注释”。也许您可以在 json 请求映射上使用特定注释,或者您可能会发现另一个更有用的属性?