Spring MVC : WebMvcConfigurationSupport 中定义的 HandlerExceptionResolver 组件

概述

Spring MVC的缺省配置类WebMvcConfigurationSupport定义了一组HandlerExceptionResolver组件到容器,供Spring MVC运行时使用,具体来讲,是被DispatcherServlet使用。本文介绍WebMvcConfigurationSupport定义了哪些HandlerExceptionResolver组件,都是什么类型,以及它们的应用目的。

HandlerExceptionResolver组件定义

WebMvcConfigurationSupportbean定义方法HandlerExceptionResolver handlerExceptionResolver() 用于定义DispatcherServlet最终使用的一组HandlerExceptionResolver。该bean实际类型是HandlerExceptionResolverComposite,表示多个HandlerExceptionResolver的组合:

	/**
	 * Returns a {@link HandlerExceptionResolverComposite} containing a list of exception
	 * resolvers obtained either through {@link #configureHandlerExceptionResolvers} or
	 * through {@link #addDefaultHandlerExceptionResolvers}.
	 * <p><strong>Note:</strong> This method cannot be made final due to CGLIB constraints.
	 * Rather than overriding it, consider overriding {@link #configureHandlerExceptionResolvers}
	 * which allows for providing a list of resolvers.
	 */
	@Bean
	public HandlerExceptionResolver handlerExceptionResolver() {
		List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<>();
		configureHandlerExceptionResolvers(exceptionResolvers);
		if (exceptionResolvers.isEmpty()) {
			addDefaultHandlerExceptionResolvers(exceptionResolvers);
		}
		extendHandlerExceptionResolvers(exceptionResolvers);
		HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
		composite.setOrder(0);
		composite.setExceptionResolvers(exceptionResolvers);
		return composite;
	}

bean定义方法HandlerExceptionResolver handlerExceptionResolver() 的工作流程基本如下 :

  1. 创建空的List<HandlerExceptionResolver> exceptionResolvers;
  2. 让实现子类指定自己的HandlerExceptionResolverexceptionResolvers;
void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)
  1. 如果实现子类没指定自己的HandlerExceptionResolver,则添加缺省的HandlerExceptionResolverexceptionResolvers;
final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)
  1. 让实现子类增加更多自定义的HandlerExceptionResolverexceptionResolvers,或者修改exceptionResolvers内容;
void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)
  1. 将所有List<HandlerExceptionResolver> exceptionResolvers包装成一个HandlerExceptionResolverComposite

缺省情况下,开发人员并不定制和修改exceptionResolvers,换句话讲,此时exceptionResolvers中只有以上第三步WebMvcConfigurationSupport缺省定义的HandlerExceptionResolver被放到exceptionResolvers中。

下面我们重点分析一下这个方法。

final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)

1. addDefaultHandlerExceptionResolvers

	protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
        // 定义一个 ExceptionHandlerExceptionResolver
		ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver();
		exceptionHandlerResolver.setContentNegotiationManager(mvcContentNegotiationManager());
		exceptionHandlerResolver.setMessageConverters(getMessageConverters());
		exceptionHandlerResolver.setCustomArgumentResolvers(getArgumentResolvers());
		exceptionHandlerResolver.setCustomReturnValueHandlers(getReturnValueHandlers());
		if (jackson2Present) {
			exceptionHandlerResolver.setResponseBodyAdvice(
					Collections.singletonList(new JsonViewResponseBodyAdvice()));
		}
		if (this.applicationContext != null) {
			exceptionHandlerResolver.setApplicationContext(this.applicationContext);
		}
		exceptionHandlerResolver.afterPropertiesSet();
		exceptionResolvers.add(exceptionHandlerResolver);

       // 定义一个 ResponseStatusExceptionResolver
		ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver();
		responseStatusResolver.setMessageSource(this.applicationContext);
		exceptionResolvers.add(responseStatusResolver);

       // 定义一个  DefaultHandlerExceptionResolver
		exceptionResolvers.add(new DefaultHandlerExceptionResolver());
	}

从该方法的实现可以看出,Spring MVC缺省使用了三个HandlerExceptionResolver,实现类如下 :

  1. ExceptionHandlerExceptionResolver
  2. ResponseStatusExceptionResolver
  3. DefaultHandlerExceptionResolver

2. 涉及到的HandlerExceptionResolver实现类

1.ExceptionHandlerExceptionResolver

如果某个HanlderMethod执行时发生了异常,尝试找到一个使用了@ExceptionHandler注解的异常处理器将异常转换成ModelAndView的形式,通常对应到一个错误视图error view

2.ResponseStatusExceptionResolver

尝试使用异常上的@ResponseStatus注解信息将异常翻译成HTTP状态字。

3.DefaultHandlerExceptionResolver

Spring MVC缺省异常处理器,最低优先级,将标准Spring MVC异常翻译成HTTP状态字。

这些类和所实现的接口HandlerExceptionResolver之间的关系如下图所示 :
在这里插入图片描述

参考文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值