SpringMVC的http请求的异常处理-HandlerExceptionResoler处理流程
文章目录
初始化
@Bean
public HandlerExceptionResolver handlerExceptionResolver() {
List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<>();
configureHandlerExceptionResolvers(exceptionResolvers);
// 添加默认的 HandlerExceptionResolver
if (exceptionResolvers.isEmpty()) {
addDefaultHandlerExceptionResolvers(exceptionResolvers);
}
extendHandlerExceptionResolvers(exceptionResolvers);
HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
composite.setOrder(0);
composite.setExceptionResolvers(exceptionResolvers);
return composite;
}
protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
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 responseStatusResolver = new ResponseStatusExceptionResolver();
responseStatusResolver.setMessageSource(this.applicationContext);
exceptionResolvers.add(responseStatusResolver);
exceptionResolvers.add(new DefaultHandlerExceptionResolver());
}
SpringMVC中默认加入的HandlerExceptionResoler
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nLRsjIF-1684591672319)(assets/image-20221215142013539.png)]
HandlerExceptionResoler的实现类在SpringMVC中的顺序
- ExceptionHandlerExceptionResolver:基于
@ExceptionHandler配置 HandlerMethod 的 HandlerExceptionResolver 实现类。例如通过@ControllerAdvice注解自定义异常处理器,加上@ExceptionHandler注解指定方法所需要处理的异常类型 - ResponseStatusExceptionResolver:基于
@ResponseStatus提供错误响应的 HandlerExceptionResolver 实现类。例如在方法上面添加@ResponseStatus注解,指定该方法发生异常时,需要设置的code响应码和reason错误信息 - DefaultHandlerExceptionResolver:默认 HandlerExceptionResolver 实现类,针对各种异常,设置错误响应码。例如 HTTP Method 不支持,则在这个实现类中往响应中设置错误码和错误信息

异常处理流程
public ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
if (this.resolvers != null) {
// 异常处理
for (HandlerExceptionResolver handlerExceptionResolver : this.resolvers) {
ModelAndView mav = handlerExceptionResolver.resolveException(request, response, handler, ex);
if (mav != null) {
return mav;
}
}
}
return null;
}
public ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable

本文深入探讨SpringMVC的异常处理流程,包括初始化阶段、默认的HandlerExceptionResolver及其处理流程。详细解析ExceptionHandlerExceptionResolver如何处理@ExceptionHandler注解的方法,ResponseStatusExceptionResolver对ResponseStatus异常的响应,以及DefaultHandlerExceptionResolver对默认异常的处理策略。
最低0.47元/天 解锁文章
514

被折叠的 条评论
为什么被折叠?



