Spring mvc 异常处理 实现HandlerExceptionResolver与@ExceptionHandler

        今天碰见一个很奇怪的bug,在本地环境下,api抛出异常为json格式,而发布到测试环境上抛出异常为html视图。html

        项目背景:该工程采用实现BaseController实现HandlerExceptionResolver进行全局的异常处理,有一点特殊的是,该工程须要对内(.net)提供api接口,对外返回视图,因此,构建了BaseController与BaseApi,其中对异常处理方法resolveException,分别返回json与视图。json

        缘由分析,首先,找到DispatcherServlet类中的processHandlerException方法,该方法用于处理异常,能够看到这里handlerExceptionResolvers保存全部的handlerExceptionResolver,从其中获取ModelAndView(我这里就是json/视图)api

        下一步app

        下一步,这里ServletInvocableHandlerMethod 为处理异常的方法测试

        进入,异常抛出类与异常处理方法从 new ExceptionHandlerMethodResolver(handlerType)获得spa

        进入ExceptionHandlerMethodResolver.net

        addExceptionMapping添加映射关系,进入detectExceptionMappingshtm

    

        detectAnnotationExceptionMappings:发现注解异常。接口

        AnnotationUtils.findAnnotation 会发现该方法所在类中的含有@ExceptionHandler的方法。io

        这里因为咱们没有使用@ExceptionHandler,因此为空。

     回到最前面,会依次调用实现了handlerExceptionResolver的类,而咱们的BaseApi与BaseController,处理的异常是同样的,只是返回不一样,因此,进入任何一个类均可以处理,这里就有不肯定性,不可以肯定必定会进入该方法所在类所实现的base类所处理的异常的方法,因此会出现这个bug。

        从上诉咱们能够看到,首先会去查找该类是否有@ExceptionHandler的方法,那么,咱们将实现handlerExceptionResolver,改成使用@ExceptionHandler,解决该问题。

相关文章
相关标签/搜索