您的位置:首页 > 编程语言 > Java开发

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

2017-03-29 00:00 211 查看
今天遇见一个很奇怪的bug,在本地环境下,api抛出异常为json格式,而发布到测试环境上抛出异常为html视图。

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

原因分析,首先,找到DispatcherServlet类中的processHandlerException方法,该方法用于处理异常,可以看到这里handlerExceptionResolvers保存所有的handlerExceptionResolver,从其中获取ModelAndView(我这里就是json/视图)



下一步



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



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



进入ExceptionHandlerMethodResolver



addExceptionMapping添加映射关系,进入detectExceptionMappings



detectAnnotationExceptionMappings:发现注解异常。

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

这里由于我们没有使用@ExceptionHandler,所以为空。



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

从上诉我们可以看到,首先会去查找该类是否有@ExceptionHandler的方法,那么,我们将实现handlerExceptionResolver,改为使用@ExceptionHandler,解决该问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: