SpringMVC之全局异常拦截器

在SpringMVC自动装配核心类之WebMvcAutoConfiguration内部实例化EnableWebMvcConfiguration过程中会触发其父类WebMvcConfigurationSupport内部初始化HandlerExceptionResolver

1.WebMvcConfigurationSupport

public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
   
	
	@Bean
	public HandlerExceptionResolver handlerExceptionResolver(
			@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager) {
   
		List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<>();
		configureHandlerExceptionResolvers(exceptionResolvers);
		if (exceptionResolvers.isEmpty()) {
   
			addDefaultHandlerExceptionResolvers(exceptionResolvers, contentNegotiationManager);
		}
		extendHandlerExceptionResolvers(exceptionResolvers);
		HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
		composite.setOrder(0);
		composite.setExceptionResolvers(exceptionResolvers);
		return composite;
	}
	
	protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers,
			ContentNegotiationManager manager) {
   
		//得到 ExceptionHandlerExceptionResolver
		ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver();
		...
		exceptionHandlerResolver.afterPropertiesSet();
		exceptionResolvers.add(exceptionHandlerResolver);
		ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver();
		responseStatusResolver.setMessageSource(this.applicationContext);
		exceptionResolvers.add(responseStatusResolver);
		exceptionResolvers.add(new DefaultHandlerExceptionResolver());
	}
}

最终返回HandlerExceptionResolver类型为HandlerExceptionResolverComposite。并且其resolvers属性包含了三种元素分别为ExceptionHandlerExceptionResolverResponseStatusExceptionResolverDefaultHandlerExceptionResolver

不管应用中是否显式指定全局异常拦截注解@ControllerAdvice。SpringMVC都会执行初始化异常处理解析器【HandlerExceptionResolver】的逻辑,唯一的区别就是ExceptionHandlerExceptionResolver内部其属性exceptionHandlerAdviceCache是否存在元素,元素存在与否表明了应用中是否显式指定全局异常拦截注解@ControllerAdvice。

1.2.ExceptionHandlerExceptionResolver

在这里插入图片描述
ControllerAdviceBean是对全局异常Handler的抽象,ExceptionHandlerMethodResolver是对Handler核心方法的抽象。

最终目的是建立并在属性exceptionHandlerAdviceCache缓存 ControllerAdviceBean & ExceptionHandlerMethodResolver 的对应关系,方便后续直接使用。

public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExceptionResolver
		implements ApplicationContextAware, InitializingBean {
   
		
	Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> exceptionHandlerAdviceCache = new LinkedHashMap<>();
	
	public void afterPropertiesSet() {
   
		initExceptionHandlerAdviceCache();
		...
	}
	
	private void initExceptionHandlerAdviceCache() {
   
		// 返回 @ControllerAdvice 注解的类
		List<ControllerAdviceBean> adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());
		for (ControllerAdviceBean adviceBean : adviceBeans) {
   
			// 全局异常拦截handler:其实就是指@ControllerAdvice注解的类
			Class<?> beanType = adviceBean.getBeanType();
			// 封装全局异常拦截handler相关属性:核心是拦截handler中的方法
			ExceptionHandlerMethodResolver resolver = new ExceptionHandlerMethodResolver(beanType);
			if (resolver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值