SpringMVC HandlerExceptionResolver踩坑记

来源:互联网 发布:jsp引入java文件 编辑:程序博客网 时间:2024/05/22 15:29

如果我们要自定义异常解析器,如统一返回json格式的异常信息给客户端,那我们就需要自定义HandlerExceptionResolver

之前是实现的接口HandlerExceptionResolver,来处理ServiceException和内部错误,后来想处理参数绑定异常BindException,但死活不成功。

原因在于,SpringMVC默认有多个异常解析器,DefaultHandlerExceptionResolver就是其中一个,而且它处理了BindException;同时,更为重要的是,(通过断点调试发现)它的顺序在自定义异常解析器之前,而org.springframework.web.servlet.DispatcherServlet#processHandlerException中是按照这些解析器的顺序来处理异常的,一旦前面的解析器处理产生结果,后面的将不再执行:

for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {            exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);            if (exMv != null) {                break;            }        }

解决:把自定义的RestHandlerExceptionResolver顺序调前:

public class RestHandlerExceptionResolver extends AbstractHandlerExceptionResolver {...省略其他代码  // 解析器顺序,越小发挥作用越早  public int getOrder() {    return 0;  }}

完。

阅读全文
1 0
原创粉丝点击