1.springboot异常处理机制?
2.Spring MVC组件之HandlerAdapter
springboot异常处理机制?
springboot的源码四种拦截机制
当我们在某些情况下需要对客户端发送来的请求进行拦截分析的时候,就需要用到拦截机制,源码比如,源码我们需要对一个请求进行计时,源码又或者需要知道当前请求需要进入哪个控制器,源码哪一个方法,源码16进制转源码该请求的源码参数是什么等等场景下都需要用到拦截机制来处理。下面,源码我们来讲解一下SpringBoot的源码几种拦截方式以及如何使用它们来处理一定的场景需求。
过滤器(filter)
拦截器(interceptor)
全局异常处理器(ControllerAdvice)
切片(aspect)
如上图所示,源码当一个请求发送来的源码时候,filter在最外层,源码resilience源码也最先拦截到请求,源码接下来就是源码interceptor,依次是源码ControllerAdvice(处理controller层异常)、aspect,最后才进入controller层去处理请求。相应的,当controller内部发生错误,抛出异常的时候,aspect最先接收到该异常,如果不对抛出的异常继续处理继续往外抛的话依次会抛到ControllerAdvice、interceptor、caffelstm源码filter。
请求的顺序:从先到后经过FilterInterceptorControllerAdviceAspect–Controller。
过滤器(filter)可以拦截发送请求的状态码以及信息,拦截器(interceptor)除了可以拦截filter可以拦截的,还可以得到当前请求进入了哪一个controller,以及映射到哪一个方法,切片(aspect),它具有上面的所有功能外,还可以得到当前请求的参数的值。全局异常处理器(ControllerAdvice)只是用于处理controller层抛出的异常
Springboot的Filter,HandlerInterceptor,Aspect与异常处理
不知你在Springboot应用开发中有没有遇到过这样的情况,mon的项目,要暴露出去给依赖的oast源码项目使用,在文件src\main\resources\META-INF\spring.factories中添加最后一行
可以被全局异常捕捉并处理成json
访问接口,如果无数据,则输出异常信息
{ "data":"packageid为:BZ-的indexpackage无记录","flag":false,"code":null,"msg":"未查到数据"}
全局异常类可以用@RestControllerAdvice,替代@ControllerAdvice,因为这里返回的主要是json格式,这样可以少写一个@ResponseBody。
springboot怎么取消同意的异常处理使用ErrorController类来实现。
系统默认的错误处理类为BasicErrorController,将会显示如上的错误页面。
这里编写一个自己的错误处理类,上面默认的处理类将不会起作用。
getErrorPath()返回的failback源码路径服务器将会重定向到该路径对应的处理类,本例中为error方法。
Spring MVC组件之HandlerAdapter
HandlerAdapter组件概述:HandlerAdapter组件在Spring MVC框架中作为处理器Handler的适配器,主要职责是适配特定的Handler以处理相应的请求。在源码中,HandlerAdapter接口定义了三个核心方法:判断HandlerAdapter组件是否支持特定handler实例的`supports`方法、使用handler实例处理具体请求的`handle`方法、获取资源最后修改值的`getLastModified`方法(已被废弃)。
HandlerAdapter类图展示了继承结构,HandlerAdapter接口由多个具体实现类继承,如HandlerFunctionAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、SimpleServletHandlerAdapter等,其中RequestMappingHandlerAdapter的继承关系稍微复杂一些。AbstractHandlerMethodAdapter作为HandlerAdapter的抽象子类,提供了`supports`、`handle`、`getLastModified`方法的虚实现。
RequestMappingHandlerAdapter在初始化时默认由Spring MVC容器处理,继承自AbstractHandlerMethodAdapter,并实现了InitializingBean和BeanFactoryAware接口,提供初始化方法处理控制器和处理逻辑的注入。
在RequestMappingHandlerAdapter的初始化过程中,它执行了几个关键操作:初始化RequestMappingHandlerAdapter类中的`initBinderAdviceCache`、`modelAttributeAdviceCache`、`requestResponseBodyAdvice`属性,通过扫描带有@ControllerAdvice注解的bean来实现控制器的注解和方法的管理。此外,它还初始化了`argumentResolvers`、`initBinderArgumentResolvers`和`returnValueHandlers`属性,分别用于参数解析、初始化参数绑定和返回值处理。
RequestMappingHandlerAdapter重写了AbstractHandlerMethodAdapter提供的三个模板方法:在`supportsInternal`方法中直接返回`true`,在`getLastModifiedInternal`方法中返回`-1`,而在`handleInternal`方法中执行处理请求的关键逻辑。处理流程大致包括准备请求参数、使用处理器处理请求和将不同类型的返回值统一为ModelAndView。
在处理请求的逻辑中,RequestMappingHandlerAdapter通过调用checkRequest方法检查请求是否符合预期,并通过invokeHandlerMethod方法执行实际的请求处理,此过程中创建了ServletWebRequest、WebDataBinderFactory和ModelFactory实例,最终通过调用ServletInvocableHandlerMethod的invokeAndHandle方法实现请求处理。
WebDataBinderFactory类用于创建DataBinder对象,主要负责参数绑定,实现了参数与String之间的类型转换,ArgumentResolver在参数解析过程中会使用WebDataBinder。ModelFactory类用于维护Model,初始化和更新Model,提供了初始化和更新Model的逻辑。
Spring MVC组件中的各个HandlerAdapter类和相关实现通过一系列的接口、抽象类和具体类的继承和实现,构建了一个灵活且可扩展的框架,用于处理HTTP请求并返回响应,支持注解驱动的控制器、参数解析、返回值处理等关键功能,形成了高效、灵活的Web应用开发基础。