经验积累-使用记录-DefaultHandlerExceptionResolver

使用背景
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值(也无效).
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值