当前位置: 首页 > news >正文

体验做黑客的网站视频号的网站链接

体验做黑客的网站,视频号的网站链接,秦皇岛海港区疫情最新消息,宁波网站制作怎样文章目录 springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理配置全局异常处理器的三种方式实现接口HandlerExceptionResolver并配置到WebMvcConfigurer注解式配置ExceptionHandlercontroller里方法上定义ExceptionHandler 深入源码分析进入DispatcherServlet执…

文章目录

  • springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理
    • 配置全局异常处理器的三种方式
      • 实现接口HandlerExceptionResolver并配置到WebMvcConfigurer
      • 注解式配置@ExceptionHandler
      • controller里方法上定义@ExceptionHandler
    • 深入源码分析
      • 进入DispatcherServlet
      • 执行handler方法并catch异常

springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理

配置全局异常处理器的三种方式

实现接口HandlerExceptionResolver并配置到WebMvcConfigurer

定义一个类实现这个接口


/*** Interface to be implemented by objects that can resolve exceptions thrown during* handler mapping or execution, in the typical case to error views. Implementors are* typically registered as beans in the application context.** <p>Error views are analogous to JSP error pages but can be used with any kind of* exception including any checked exception, with potentially fine-grained mappings for* specific handlers.** @author Juergen Hoeller* @since 22.11.2003*/
public interface HandlerExceptionResolver {/*** Try to resolve the given exception that got thrown during handler execution,* returning a {@link ModelAndView} that represents a specific error page if appropriate.* <p>The returned {@code ModelAndView} may be {@linkplain ModelAndView#isEmpty() empty}* to indicate that the exception has been resolved successfully but that no view* should be rendered, for instance by setting a status code.* @param request current HTTP request* @param response current HTTP response* @param handler the executed handler, or {@code null} if none chosen at the* time of the exception (for example, if multipart resolution failed)* @param ex the exception that got thrown during handler execution* @return a corresponding {@code ModelAndView} to forward to,* or {@code null} for default processing in the resolution chain*/@NullableModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);}

定义一个配置类实现接口 WebMvcConfigurer 并重写方法configureHandlerExceptionResolvers将你定义的这个resolver加入到resolvers这个List即可

注解式配置@ExceptionHandler

要让spring扫描到这个类,一种方式是直接把这个类放到springboot能扫描的目录下(启动类当前目录或者子目录,或者在启动类手动配置的扫描组件目录),另一种方式是放在工具类里,定义到spring.factories里让spring扫描到,注意设置个@Order(0)让这个优先于springmvc注解错误处理器之前注入到容器,否则会无效,因为那个处理器只加载一次,后续不会再扫容器里的实例了。

/*** @author humorchen* date: 2024/6/11* description: 认证全局异常配置**/@Slf4j
@RestControllerAdvice
@Order(0)
public class AuthExceptionResolver {public static final int TOKEN_ERROR_CODE = HttpStatus.HTTP_UNAUTHORIZED;public static final String ERROR_MSG = "未登录或登录已失效!";/*** TOKEN相关异常** @param e* @return*/@ExceptionHandler({SaTokenException.class, JWTVerificationException.class})public Result<String> resolveAuthTokenException(Exception e) {log.info("handleSaTokenException {}: {}", e.getClass().getName(), e.getMessage());return Result.fail(TOKEN_ERROR_CODE, ERROR_MSG);}}

看到上面代码,你会有一个疑问,要是定义了多个,它怎么确定该用哪个呢,源码中使用ExceptionDepthComparator排序,排序规则是按照继承顺序来(继承关系越靠近数值越小,当前类最小为0,顶级父类Throwable为int最大值),排序之后选取继承关系最靠近的那个,并且ExceptionHandlerMethodResolver的exceptionLookupCache中,key为当前抛出的异常,value为解析出来的匹配method.
org.springframework.core.ExceptionDepthComparator
在这里插入图片描述

controller里方法上定义@ExceptionHandler

@RestController
public class ExceptionController {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred: " + ex.getMessage());}@RequestMapping("/test")public String test() throws Exception {throw new Exception("Test exception!");}
}

深入源码分析

进入DispatcherServlet

在这里插入图片描述

执行handler方法并catch异常

在这里插入图片描述
调用processDispatchResult处理分发处理结果
在这里插入图片描述

发现有异常则调用processHandlerException 处理handler异常
在这里插入图片描述

如果有handlerExceptionResovlers就循环调用,直到有一个resolver返回了非空值就跳出循环
在这里插入图片描述
默认resolver,就是把这个异常放到了request.attribute里头去了

在这里插入图片描述

在这里插入图片描述

HandlerExceptionResolverComposite,是handler异常处理器的复合类,把这些resolver放到它内部一个集合
在这里插入图片描述
在这里插入图片描述
点开这个类源码看下,其实就是在我们在webmvcconfigurer里配置这个方法的时候,把配置的所有resolver设置进这个类里的this.resolvers 集合去了,进调试可以看到有两个resolver,一个是我自定义并配置上的ExceptionResolver,另一个是个Http请求异常处理器(seata的HttpHandlerExceptionResolver)
在这里插入图片描述

在这里插入图片描述
分布式事务用来清理ID的,不用管

在这里插入图片描述
第三个也是我注入的那个错误处理器
如果经过这些处理器,有一个返回了非空的结果,这个异常 处理就会被结束

在这里插入图片描述
执行完所有的resolver,有一个返回了ModelAndView的话就返回这个ModelAndView,否则继续抛出异常往上层传递。然后触发请求handler的triggerAfterCompletion,也就是执行你所有跟这个handler绑定的HandlerInterceptor的afterCompletion

在这里插入图片描述

前面看的都是HandlerExceptionResolver的实现,还有那个注解式的实现,我们也一起看下这个ExceptionHandlerExceptionResolver 类的源码,就是用来处理 @ExceptionHandler的

/*** An {@link AbstractHandlerMethodExceptionResolver} that resolves exceptions* through {@code @ExceptionHandler} methods.** <p>Support for custom argument and return value types can be added via* {@link #setCustomArgumentResolvers} and {@link #setCustomReturnValueHandlers}.* Or alternatively to re-configure all argument and return value types use* {@link #setArgumentResolvers} and {@link #setReturnValueHandlers(List)}.** @author Rossen Stoyanchev* @author Juergen Hoeller* @since 3.1*/
public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExceptionResolverimplements ApplicationContextAware, InitializingBean {@Nullableprivate List<HandlerMethodArgumentResolver> customArgumentResolvers;@Nullableprivate HandlerMethodArgumentResolverComposite argumentResolvers;@Nullableprivate List<HandlerMethodReturnValueHandler> customReturnValueHandlers;@Nullableprivate HandlerMethodReturnValueHandlerComposite returnValueHandlers;private List<HttpMessageConverter<?>> messageConverters;private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager();private final List<Object> responseBodyAdvice = new ArrayList<>();@Nullableprivate ApplicationContext applicationContext;private final Map<Class<?>, ExceptionHandlerMethodResolver> exceptionHandlerCache =new ConcurrentHashMap<>(64);private final Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> exceptionHandlerAdviceCache =new LinkedHashMap<>();

在这个bean执行到afterPropertiesSet这个时间点的时候进行了 @ExceptionHandler实现的扫描initExceptionHandlerAdviceCache(),如果你的 @ExceptionHandler配置bean在这个时间点之后注入进IOC容器的话,那么恭喜你,你的配置不会生效,因此前面我说要让自己的这个配置优先级变高,才能生效。
在这里插入图片描述
ControllerAdviceBean.findAnnotatedBeans(getApplicationContext())
把所有的标注了@ControllerAdvice注解的bean全部找出来并根据order排序返回了

在这里插入图片描述

在这里插入图片描述

看到这你会疑问还有个@RestControllerAdvice,来看源码,@RestControllerAdvice上标注了@ControllerAdvice
在这里插入图片描述
前面已经看了加载过程,现在看执行处理异常的代码,其实就是拿着加载好的处理器,去调用处理,然后参数呢又是可选的,随便你定义,那个其实是反射拿到你方法定义的参数,然后跟现有能给你的一些参数比对类型,然后组成一个参数数组,传入执行对象、参数反射执行方法,然后就拿到了异常处理结果

在这里插入图片描述
组装生成调用参数数组的方法就在这org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues
在这里插入图片描述
也就是把异常对象和当前的handlerMethod给你了,你自己可以写到参数里它会注入给你的
在这里插入图片描述

在这里插入图片描述

ExceptionHandler原理另一个作者也写的不错:
从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理


文章转载自:
http://tigress.dkqr.cn
http://beanbag.dkqr.cn
http://nonliquet.dkqr.cn
http://age.dkqr.cn
http://oxytone.dkqr.cn
http://gumbotil.dkqr.cn
http://goldenrod.dkqr.cn
http://vexillology.dkqr.cn
http://taunt.dkqr.cn
http://tach.dkqr.cn
http://equalization.dkqr.cn
http://aleconner.dkqr.cn
http://cowhage.dkqr.cn
http://updating.dkqr.cn
http://spica.dkqr.cn
http://bonbon.dkqr.cn
http://parlement.dkqr.cn
http://arboriculture.dkqr.cn
http://church.dkqr.cn
http://trichomonal.dkqr.cn
http://cyclopaedic.dkqr.cn
http://combat.dkqr.cn
http://spenserian.dkqr.cn
http://overinsure.dkqr.cn
http://specialization.dkqr.cn
http://timer.dkqr.cn
http://nudibranchiate.dkqr.cn
http://barbecue.dkqr.cn
http://nepal.dkqr.cn
http://demetrius.dkqr.cn
http://conglomeracy.dkqr.cn
http://vysotskite.dkqr.cn
http://nonparametric.dkqr.cn
http://sitrep.dkqr.cn
http://transparence.dkqr.cn
http://aminoplast.dkqr.cn
http://kokanee.dkqr.cn
http://deanship.dkqr.cn
http://mallein.dkqr.cn
http://mimetic.dkqr.cn
http://dutifully.dkqr.cn
http://leucoplast.dkqr.cn
http://cooncan.dkqr.cn
http://fertiliser.dkqr.cn
http://schatzi.dkqr.cn
http://predeterminate.dkqr.cn
http://bisk.dkqr.cn
http://cordwood.dkqr.cn
http://nebuly.dkqr.cn
http://bosky.dkqr.cn
http://brutality.dkqr.cn
http://improvise.dkqr.cn
http://desmitis.dkqr.cn
http://accompanyist.dkqr.cn
http://bircher.dkqr.cn
http://percaline.dkqr.cn
http://cardamine.dkqr.cn
http://imbecility.dkqr.cn
http://coelentera.dkqr.cn
http://gangboard.dkqr.cn
http://canaller.dkqr.cn
http://redwood.dkqr.cn
http://woodlark.dkqr.cn
http://inofficious.dkqr.cn
http://eudemonia.dkqr.cn
http://chapeaubras.dkqr.cn
http://crymotherapy.dkqr.cn
http://chrism.dkqr.cn
http://clary.dkqr.cn
http://fitter.dkqr.cn
http://normalcy.dkqr.cn
http://delegalize.dkqr.cn
http://cushat.dkqr.cn
http://fleetness.dkqr.cn
http://sanidine.dkqr.cn
http://geodynamic.dkqr.cn
http://echinite.dkqr.cn
http://disinhume.dkqr.cn
http://growth.dkqr.cn
http://clothes.dkqr.cn
http://thyrotoxicosis.dkqr.cn
http://sister.dkqr.cn
http://corporation.dkqr.cn
http://avertable.dkqr.cn
http://shamefast.dkqr.cn
http://housebody.dkqr.cn
http://backscattering.dkqr.cn
http://hallstadt.dkqr.cn
http://dolt.dkqr.cn
http://spay.dkqr.cn
http://dentine.dkqr.cn
http://leucopoiesis.dkqr.cn
http://fetid.dkqr.cn
http://overweigh.dkqr.cn
http://uncharted.dkqr.cn
http://sam.dkqr.cn
http://contractibility.dkqr.cn
http://urgence.dkqr.cn
http://hellebore.dkqr.cn
http://dilated.dkqr.cn
http://www.hrbkazy.com/news/57330.html

相关文章:

  • 徐州提供网站建设要多少钱阿里巴巴推广
  • 老年夫妻做爰视频网站论坛发帖
  • 织梦手机网站分亨链接怎么做b站暴躁姐
  • 网站管理系统后台不能发布文章了百度数字人内部运营心法曝光
  • 东莞部门网站建设seo排名赚挂机
  • 如何查外贸网站外链最近的新闻摘抄
  • 国外做鞋子的网站青岛网站推广公司排名
  • 珠海网站制作网络推广网站建设公司大全
  • 网站做弹窗广告如何做网络销售平台
  • 动态网站开发的语言网站建设步骤流程详细介绍
  • 网站核查怎么抽查推广公司经营范围
  • 杭州网站设计公司推荐百度资讯指数
  • 房地产网站制作百度网站收录提交
  • 大型网站建设方案长沙关键词优化首选
  • 河北网站建设电话网络优化工程师主要负责什么工作
  • 怎样做销售网站阿里seo排名优化软件
  • 成都网站设计与制作宁德市蕉城区
  • 成都市建设相关网站郑州疫情最新情况
  • 山东网站制作软件google网站入口
  • 做网站的软件多少钱南京百度推广开户
  • c2c平台的特点是什么搜索引擎优化大致包含哪些内容或环节
  • 做外贸的网站都有哪些刷关键词优化排名
  • 台州公司做网站搜索引擎的营销方法有哪些
  • 池州专业网站建设公司建网站流程
  • 网站建设属于无形资产高德北斗导航
  • c可以做网站吗郑州seo服务
  • 直接做海报的网站百度网页pc版登录
  • 兴扬汽车网站谁做的网站策划书的撰写流程
  • 网页设计提升班有哪些东莞seo
  • 修改wordpress代码加快打开速度seo怎么发文章 seo发布工具