使用背景
1.项目基于springmvc.
2.因为某种需要,想修改DefaultHandlerExceptionResolver的行为,或者调整默认的错误处理行为.
遇到的问题
1.SpringMVC默认不拦截4xx错误,比如(400,405,404)等.
2.hibernate-validate的校验中,有400错误(缺少毕传参数的错误校验,及对应字段为空),这个时候无法拦截,我发准确提示错误.
3.指定的绑定异常,是非业务异常,需要有统一的异常处理器,来专门处理校验异常,但是和默认的校验器冲突.
如何让SpringMVC能拦截4xx的异常(400,405)
dispatcher中增加throwExceptionIfNoHandlerFound配置项
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
如何实现统一的异常处理
1.继承AbstractHandlerExceptionResolver,做自己的异常拦截.
2.在springmvc配置文件中,增加一项配置
<bean class="com.bruce.tool.validate.hibernate.resolver.ValidExceptionResolver">
<property name="order" value="-1"/>
</bean>
3.这里配置属性order=-1,为了让自定义异常,优先级高于DefaultHandlerExceptionResolver,这样才能改变默认的400,405等异常的处理方式.
4.DefaultHandlerExceptionResolver默认的order值为2.
校验异常如何处理
1.在自定义异常处理中,专门拦截校验相关的异常,如:
MissingPathVariableException
MethodArgumentNotValidException
BindException
2.这里处理异常,可以返回json,也可以返回自己定义的其他格式的返回数据.
3.其他的异常,直接返回null,留给后边的处理器处理.
补充说明
1.这里在自定义的异常处理器中,设置order,非常重要.
2.order的主要作用是设置异常处理器的优先级.
3.自定义的拦截器需要继承自AbstractHandlerExceptionResolver,否则无法设置order.
4.SpringMVC中要让DefaultHandlerExceptionResolver的优先级靠后,最简单的办法,就是设置order.
5.其他的修改优先级的办法:
配置中修改DefaultHandlerExceptionResolver对象的order(无效).
启动好之后,从SpringContextUtil中获取bean,然后修改order值(也无效).