这就要涉及到我们这一篇主要讲的HandlerExceptionResolver 2.原理 其实springmvc已经默认给我们注入了3个异常处理的解器: AnnotationMethodHandlerExceptionResolver DefaultHandlerExceptionResolver(默认异常处理器) 2.1 依赖 2.1.1 解析器依赖 2.1.2 springmvc内部处理的一些标准异常 2.2 接口说明 public interface HandlerExceptionResolver 在我们自己去实现自定义异常解析器的时候,我们一般是去继承AbstractHandlerExceptionResolver AbstractHandlerExceptionResolver实现了HandlerExceptionResolver ModelAndView exMv = null; for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers ) { exMv = handlerExceptionResolver.resolveException(request, response, handler, ex); if (exMv
实现 @Configuration public class GlobalException1 implements HandlerExceptionResolver{ @Override
但是作为新时代的程序员,我估计已经很少人知道HandlerExceptionResolver这个异常处理器接口(更有甚者连ModelAndView都没听说过也大有人在啊),虽然这不应该,但存在即合理。 回忆上篇文章讲述HandlerExceptionResolver,你是否疑问过这个问题:通过HandlerExceptionResolver如何返回一个json串呢? HandlerExceptionResolver如何返回JSON格式数据? 基于上篇文章案例自定义了一个异常处理器来处理Handler抛出的异常,示例中返回的是一个页面ModelAndView。 这时若你项目较老,使用的仍旧是HandlerExceptionResolver方式处理异常的话,我在本处提供两种处理方式,供以参考: 方式一:response直接输出json 自定义异常处理器(匿名实现 这两种方式都是基于自定义HandlerExceptionResolver实现类的方式来处理异常,最终给前端返回一个json串。
这就要涉及到我们这一篇主要讲的HandlerExceptionResolver 2.原理 其实springmvc已经默认给我们注入了3个异常处理的解器: AnnotationMethodHandlerExceptionResolver 2.2 接口说明 public interface HandlerExceptionResolver { /** * Try to resolve the given exception 在我们自己去实现自定义异常解析器的时候,我们一般是去继承AbstractHandlerExceptionResolver AbstractHandlerExceptionResolver实现了HandlerExceptionResolver ModelAndView exMv = null; for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers ) { exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
应用的全局异常处理,上一篇介绍了ControllerAdvice结合@ExceptionHandler的方式来实现web应用的全局异常管理; 本篇博文则带来另外一种并不常见的使用方式,通过实现自定义的HandlerExceptionResolver ,来处理异常状态 上篇博文链接: SpringBoot系列教程web篇之全局异常处理 本篇原文: SpringBoot系列教程web篇之自定义异常处理HandlerExceptionResolver HandlerExceptionResolver 1. 自定义异常处理 HandlerExceptionResolver顾名思义,就是处理异常的类,接口就一个方法,出现异常之后的回调,四个参数中还携带了异常堆栈信息 @Nullable ModelAndView 小结 本篇博文虽然也介绍了一种新的全局异常处理方式,实现效果和ControllerAdvice也差不多,但是并不推荐用这种方法, 原因如下 HandlerExceptionResolver的方式没有ControllerAdvice
Spring MVC更多家族成员---框架内异常处理与HandlerExceptionResolver---09 引言 源码体现 HandlerExceptionResolver AbstractHandlerExceptionResolver 默认加载的HandlerExceptionResolver DefaultHandlerExceptionResolver ResponseStatusExceptionResolver HandlerExceptionResolver HandlerExceptionResolver,如果某个HandlerExceptionResolver对当前异常解析完后,返回了非null的ModelAndView,那么就直接中断返回 exMv HandlerExceptionResolver的定义如下: public interface HandlerExceptionResolver { @Nullable ModelAndView HandlerExceptionResolver的继承图谱如下所示: AbstractHandlerExceptionResolver基本上是所有HandlerExceptionResolver
Spring MVC作为如此优秀的web层框架,自然考虑到了这一点,因此它从首个版本便提供了异常处理器HandlerExceptionResolver,这便是本文的主要议题。 Spring MVC提供处理异常的方式主要分为两种: 实现HandlerExceptionResolver方式 @ExceptionHandler注解方式。注解方式也有两种用法: 1. HandlerExceptionResolver 它是Spring首个版本就提供了的异常处理器接口,定义也非常的简单: // @since 22.11.2003 public interface HandlerExceptionResolver context, HandlerExceptionResolver.class, true, false); if (! 相关阅读 @ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?
ModelAndView exMv = null; for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers ) { exMv = handlerExceptionResolver.resolveException(request, response, handler, ex); 接口,它对HandlerExceptionResolver接口约定的方法的所实现代码如下: public ModelAndView resolveException(HttpServletRequest 例如通过for循环依次发现轮到DefaultHandlerExceptionResolver才能处理,那么最终会执行该handlerExceptionResolver的doResolveException 从客户端请求过程中来看,可以自定义handlerExceptionResolver,只需实现HandlerExceptionResolver接口即可,例如: public class ApiHandlerExceptionResolver
3 Spring异常统一处理 3.1 Spring加载并暴露ControllerAdvice WebMvcConfigurationSupport#handlerExceptionResolver() 实例化并注册一个ExceptionHandlerExceptionResolver: @Bean public HandlerExceptionResolver handlerExceptionResolver (context, HandlerExceptionResolver.class, true, false); if (! 4 修正 为利用到 Spring MVC 异常处理机制,改造Filter: 手动捕获异常 将异常通过 HandlerExceptionResolver 解析处理 修改 PermissionFilter { @Autowired @Qualifier("handlerExceptionResolver") private HandlerExceptionResolver resolver
图1 ExceptionHandlerExceptionResolver是HandlerExceptionResolver,所以在Springmvc的doDispatch中会调用它。 HandlerExceptionResolver是个接口,如下List-4所示: List-4 public interface HandlerExceptionResolver { @Nullable = null) { for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers ) { exMv = handlerExceptionResolver.resolveException(request, response, handler, ex); ExceptionHandlerExceptionResolver是如何加入到Springmvc中handlerExceptionResolvers的,是因为DispatcherServlet.properties中HandlerExceptionResolver
1.异常处理的两种方式 1.使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver 2.实现Spring的异常处理接口HandlerExceptionResolver 提供的简单异常处理器SimpleMappingExceptionResolver 处理逻辑:使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver,处理器实现HandlerExceptionResolver java.lang.ClassCastException" value="ClassCastException"/> </map> </property> </bean> 2.实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 2.1实现HandlerExceptionResolver package com.pjh.Myexception; import com.sun.org.apache.bcel.internal.generic.MONITORENTER ; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView
** [在这里插入图片描述] 1.异常处理的两种方式 1.使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolve 2.实现Spring的异常处理接口HandlerExceptionResolver 提供的简单异常处理器SimpleMappingExceptionResolve **处理逻辑**:使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver,处理器实现HandlerExceptionResolver value="ClassCastException"/> </map> </property> </bean> 2.实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 **2.1实现HandlerExceptionResolver** package com.pjh.Myexception; import com.sun.org.apache.bcel.internal.generic.MONITORENTER ; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView
Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; (2)实现Spring的异常处理接口HandlerExceptionResolver 实现HandlerExceptionResolver 接口异常处理器 1、增加HandlerExceptionResolver 接口的实现类MyExceptionHandler,代码如下: public class MyExceptionHandler implements HandlerExceptionResolver { public ModelAndView resolveException
第一步:肯定是在Springboot启动的过程中进行的异常处理初始化,于是就找到了handlerExceptionResolver类,在创建该类的时候,会进行添加我们自定义异常。 1 public HandlerExceptionResolver handlerExceptionResolver( 2 @Qualifier("mvcContentNegotiationManager ") ContentNegotiationManager contentNegotiationManager) { 3 List<HandlerExceptionResolver> exceptionResolvers 所有异常添加完毕了,我们来测试一下异常来的时候,Springboot是如何选择自定义异常并返回的,我们上面所有的操作都是在创建HandlerExceptionResolver时进行的,为什么要添加到HandlerExceptionResolver 9 .beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true,
使用 HandlerExceptionResolver 接口 除了使用@ControllerAdvice 注解和@ExceptionHandler 注解外,还可以实现 HandlerExceptionResolver 下面是一个使用 HandlerExceptionResolver 接口的例子: public class GlobalExceptionHandler implements HandlerExceptionResolver mav.addObject("exception", ex); mav.setViewName("error"); return mav; } } 在上面的例子中,我们实现了 HandlerExceptionResolver 总结: 在本文中,我们介绍了 SpringBoot 中三种处理异常的方式,分别是使用@ControllerAdvice 注解、@ExceptionHandler 注解和 HandlerExceptionResolver
继承 HandlerExceptionResolver 版本 HandlerExceptionResolver 要实现里面的一个方法 模板代码如下 import org.springframework.web.servlet.HandlerExceptionResolver import javax.servlet.http.HttpServletResponse; /** * 统一异常处理 */ public class MyException implements HandlerExceptionResolver
HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter"; public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver boolean detectAllHandlerAdapters = true; /** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver handlerAdapters; /** List of HandlerExceptionResolvers used by this servlet */ private List<HandlerExceptionResolver HandlerExceptionResolver 接口 - 异常处理 SimpleMappingExceptionResolver:通过配置文件进行异常处理。 HandlerExceptionResolver 4.
springmvc就是将异常层层向外抛出,最后由springmvc的前端控制器调用异常处理组件HandlerExceptionResolver(处理器异常解析器)进行处理 —————————————— message; } public ResultBean(T data) { this(); this.data = data; } } 实现 HandlerExceptionResolver 接口 @Component public class MyException implements HandlerExceptionResolver{ /** * TODO * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest } } 优先级 既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题: 当发生异常的时候,SpringMVC会如下处理: (1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver
以下是一个使用异常处理器配置处理运行时异常的示例:<bean id="<em>handlerExceptionResolver</em>" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver 这种方式需要实现<em>HandlerExceptionResolver</em>接口,并将其注册到处理器映射器中。当应用程序发生异常时,处理器映射器将自动查找相应的异常处理器来处理异常。 以下是一个使用自定义异常处理器处理运行时异常的示例:public class CustomExceptionHandler implements <em>HandlerExceptionResolver</em> { "Internal Server Error"); return modelAndView; }}在这个例子中,我们自定义了一个CustomExceptionHandler异常处理器,并实现了HandlerExceptionResolver
前端控制器交由异常处理器进行异常处理,如下图: 1.2 异常处理两种方式 ① 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver ② 实现Spring的异常处理接口HandlerExceptionResolver java.lang.ClassCastException" value="error2"/> </map> </property> </bean> 1.4 自定义异常处理步骤 ①创建异常处理器类实现HandlerExceptionResolver public class MyExceptionResolver implements HandlerExceptionResolver { /* 参数Exception:异常对象 ("abcde"); } 1.5 知识要点 异常处理方式 配置简单异常处理器SimpleMappingExceptionResolver 自定义异常处理器 自定义异常处理步骤 ①创建异常处理器类实现HandlerExceptionResolver