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

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

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

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

162914_D3FE_1416405.png

        下一步

163449_jE76_1416405.png

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

163702_15IE_1416405.png

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

164201_dAsO_1416405.png

        进入ExceptionHandlerMethodResolver

164329_SGbI_1416405.png

        addExceptionMapping添加映射关系,进入detectExceptionMappings

    164701_mPs1_1416405.png

        detectAnnotationExceptionMappings:发现注解异常。

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

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

165059_PeWN_1416405.png

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

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

转载于:https://my.oschina.net/u/1416405/blog/870124

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值