SpringMVC学习之HandlerMapping

起因 新服务在处理不存在的url请求时,上报日志报错,具体错误信息: 根据报错信息找到相关代码 代码处做了对参数hanler的强制转换,但是真正传入的参数类型为 ResourceHttpRequestHandler 导致转换失败而报错,梳理一下,handler是在 自定义的日志Interceptor 的afterCompletion方法中由框架传入的 ResourceHttpRequestHandler 是什么? 查阅类文档,ResourceHttpRequestHandler是SpringMVC提供的处理静态资源的Handler,比如常见的js或者css文件。在当前前后端分离的分工下,对于REST服务开发,不会再使用这种方式提供对静态资源的访问,为什么请求了一个不存在的url,会使用静态资源的Hanlder来处理? SpringMVC提供了哪些HandlerMapping? SpringMVC提供的HanlderMapping位于 org.springframework.web.servlet.handler 包下,主要包含 Mapping Desc RequestMappingHandlerMapping 处理@RequestMapping 注解映射关系 SimpleUrlHandlerMapping 使用URL模式匹配映射关系 BeanNameUrlHandlerMapping 基于Bean名匹配映射关系 SpringMVC 路径映射流程回顾 回顾一下SpringMVC的路径映射流程,通常的url请求的编码方式为: @RequestMapping("/ping") public Response<String> ping() { return Response.success("pong"); } 标识了 @RequestMapping 注解的方法会被 SpringMVC 框架的 RequestMappingHandlerMapping 类在启动时进行扫描并根据映射信息来创建 RequestMappingInfo(RequestMappingInfo 类维护请求的映射信息),扫描后的所有Mapping信息在 MappingRegistry(AbstractHandlerMethodMapping内部类) 类进行维护 SpringMVC如何处理request与HandlerMethod的映射关系 AbstractHandlerMethodMapping的getHandler 方法用来通过给定的request来找到一个合适的handler进行处理 getHandler会先调用抽象方法 getHandlerInternal 由子类实现查找逻辑,如果找不到,则查找默认配置的Hanlder,默认Hanlder找不到则返回null SpringMVC默认使用了哪些HandlerMapping 如何查询Handler是在 DispacherServlet的getHandler方法操作的,它会在所有的handlerMappings(有序handlerMapping)中查找出一个可用的handler进行request的处理 如图可知会在7个handlerMapping中依次进行查询,这些handlerMapping是在 DispatcherServlet#initHandlerMappings() 设置的 定位到问题原因 跟踪请求代码发现对于不存在的url会在 SimpleUrlHanlderMapping中找到可用的handler,因为最终请求url匹配上了 /**,而 /** 模式对应的handler就是 ResourceHttpRequestHandler,此时getHandler的结果就是ResourceHttpRequestHandler 了,但是在上报时使用的是 HandlerMethod,执行到此时报了转换异常 WebMvcAutoConfiguration中的SourceHandler在哪注册的? 在启用MVC功能时,会增加注解 @EnableWebMvc,而对应的MVC配置类为 WebMvcConfigurationSupport,在这个类中进行SourceHandler的注册。跟踪代码发现两个ResourceHandler是在 WebMvcAutoConfigurationAdapter中添加的 ...

April 18, 2025 · 1 min · 72 words · tomyli

众乐乐-weekly 第14期

Read 📖 中国民航局颁发首批飞行出租车运营合格证 看了一下宣传片,有机会要体验一下,空间上感觉坐两个人有些拥挤 JetBrains IDEs Go AI: Coding Agent, Smarter Assistance, Free Tier | The JetBrains Blog JetBrains在最新的版本提供了可以免费使用的AI,目前看只有一个模型:Qwen Max Tools 🧰 Vivaldi Browser | Powerful, Personal and Private web browser 由于近期的 FireFox 事件,要多装几个注重隐私的浏览器 Windsurf Editor | Windsurf (formerly Codeium) AI编辑器,大量使用价格具有性价比 pypa/pipx: Install and Run Python Applications in Isolated Environments 更方便的在隔离环境运行Python应用 nomic-ai/gpt4all: GPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use. 在命令行运行本地大模型,跨平台支持 ProNotes 对Mac 的Notebook进行样式增强的APP,Pro版本带AI功能 Image 🖼️ Speech 💬 任何时候,都不要放弃自己的思考 ...

April 14, 2025 · 1 min · 76 words · tomyli

SpringMVC学习之Exception处理

背景 开发过程中,会出现很多异常情况,比如RPC调用异常、请求参数异常,SpringMVC是如何处理异常信息的? Spring处理异常的方式 Spring采用了全局的异常捕获统一处理的方式,虽然JAVA的异常机制一直有争议,但是Spring还是选择基于实际开发需要使用抛异常后捕获统一处理的方式 HandlerExceptionResolver登场 HandlerExceptionResolver 是SpringMVC提供的解析Handler调用过程抛出异常的解析器,只提供了一个解析异常的方法 resovleException Spring提供了哪些ExceptionResolver? 经典的Interface-Abstract方式的实现类 Resolver Desc SimpleMappingExceptionResolver 提供exception class name到view的映射 DefaultHandlerExceptionResolver 默认Resolver实现,用于解析标准的SpringMVC异常并转换成对应的Http状态码 ResponseStatusExceptionResolver 基于 @ResponseStatus 注解来映射异常与Http状态码 ExceptionHandlerExceptionResolver 基于 @ExceptionHalder 注解来解析处理异常信息 直接实现HandlerExceptionResolver的类 Resolver Desc DefaultErrorAttributes 默认错误属性实现 HandlerExceptionResolverComposite 代理其它Resolver集合的ExceptionResolver HandlerExceptionResolverComposite 中包含了一个解析列表,可以判断是会排序后顺序调用,以找到第一个可以处理的Resolver 具体异常处理流程 异常处理的核心逻辑都在 processHandlerException 方法中,Spring处理完请求后,如果有异常抛出,则会把异常信息传给 processHandlerException 方法, processHandlerException 遍历持有的 handlerExceptionResolvers 进行对异常的解析,如果解析成功则直接返回对应的 ModelAndView(此返回与正常的handler处理返回保持了一致) handlerExceptionResolvers 有哪些? 在 SpringMVC启动时会调用 initHandlerExceptionResolvers 方法来查找所有可用的 handlerExceptionResolver 并保存到 handlerExceptionResolvers 变量中。SpringMVC配置了两个 resolver 来提供异常解析 errorAttributes 此Resolver是在 ErrorMvcAutoConfiguration 进行实例化的 此实现的 resolverExcption 方法逻辑简单,直接返回了null,不是关注重点 handlerExceptionResolver 此Resolver真正的实现类为 HandlerExceptionResolverComposite ,也就是持有多个ExceptionResolver列表的 Resolver,它是在 WebMvcConfigurationSupport 实例化的 ...

April 14, 2025 · 1 min · 139 words · tomyli

SpringMVC统一配置接口WebMvcConfigurer功能

接口说明 WebMvcConfigurer是Spring提供的统一配置接口,用于自定义Spring MVC的配置,全局更改服务的行为,提供的可配置项: 方法名称 参数 用途 addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) List<HandlerMethodArgumentResolver> argumentResolvers 添加自定义的 HandlerMethodArgumentResolver 用于解析方法参数。 addCorsMappings(CorsRegistry registry) CorsRegistry registry 配置跨域资源共享 (CORS) addFormatters(FormatterRegistry registry) FormatterRegistry registry 添加自定义的格式化程序和转换器 addInterceptors(InterceptorRegistry registry) InterceptorRegistry registry 添加自定义的拦截器 addRequestMappings(RequestMappingInfo customization, Class<Controller> controllerClass) RequestMappingInfo customization, Class<Controller> controllerClass 关联自定义请求映射到具控制器类 addResourceHandlers(ResourceHandlerRegistry registry) ResourceHandlerRegistry registry 配置资源处理,如静态资源路径 addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) List<HandlerMethodReturnValueHandler> returnValueHandlers 添加自定义的 HandlerMethodReturnValueHandler 用于处理方法返回值 addViewControllers(ViewControllerRegistry registry) ViewControllerRegistry registry 注册视图控制器 configureAsyncSupport(AsyncSupportConfigurer configurer) AsyncSupportConfigurer configurer 配置异步支持 configureContentNegotiation(ContentNegotiationConfigurer configurer) ContentNegotiationConfigurer configurer 配置内容协商策略 configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) DefaultServletHandlerConfigurer configurer 启用默认 Servlet 处理 configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) List<HandlerExceptionResolver> exceptionResolvers 配置异常处理程序 configureMessageConverters(List<HttpMessageConverter<?>> converters) List<HttpMessageConverter<?>> converters 配置自定义的 HttpMessageConverter configurePathMatch(PathMatchConfigurer configurer) PathMatchConfigurer configurer 配置路径匹配规则 configureViewResolvers(ViewResolverRegistry registry) ViewResolverRegistry registry 配置视图解析器 extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) List<HandlerExceptionResolver> exceptionResolvers 扩展异常处理程序 extendMessageConverters(List<HttpMessageConverter<?>> converters) List<HttpMessageConverter<?>> converters 扩展自定义的 HttpMessageConverter extendInterceptors(List<HandlerInterceptor> interceptors) List<HandlerInterceptor> interceptors 扩展拦截器 extendArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) List<HandlerMethodArgumentResolver> argumentResolvers 扩展自定义的 HandlerMethodArgumentResolver 用于解析方法参数。 extendReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) List<HandlerMethodReturnValueHandler> returnValueHandlers 扩展自定义的 HandlerMethodReturnValueHandler 用于处理方法返回值。 extendViewResolvers(List<ViewResolver> viewResolvers) List<ViewResolver> viewResolvers 扩展视图解析器 关联类 WebMvcConfigurationSupport EnableWebMvc 接口常用方法 接口提供了将近20个方法对Spring的配置进行调整,本次只针对常用的Rest接口开发相关内容进行展开学习研究 ...

March 28, 2025 · 3 min · 461 words · tomyli

收集的Cursor信息

整理收集的关于Cursor编辑器的信息 Features | Cursor - The AI Code Editor Cursor Directory - Cursor Rules & MCP Servers eastlondoner/cursor-tools: Give Cursor Agent an AI Team and Advanced Skills 学习 Cursor ,拥抱 AI 编程 | Cursor 101 PatrickJS/awesome-cursorrules: 📄 A curated list of awesome .cursorrules files

February 25, 2025 · 1 min · 44 words · tomyli

大鹏慢读-tomyli的读书2025

DONE 非暴力沟通 DONE 金榜题名之后 DONE 我的二本学生 DONE 芯片战争 DONE 万历十五年 DONE 万历十五年欧洲那些事儿 DONE 我看见的世界 DONE 英伟达之道 DONE 可能性的艺术 DONE 邓小平时代 DONE 《他影响了中国:陈云》 CANCELLED 伟大的道路 CANCELLED DONE 简读中国史 STARTED 20世纪简史 TODO 超越感觉 TODO 练习的心态

January 17, 2025 · 1 min · 33 words · tomyli

收集的羽毛球技巧

说明 最近痴迷于羽毛球,记录一下自己学习过程中的个人认为有用的,可实践提升能力的内容 资源 杨晨大神视频专辑-杨晨大神视频合集-哔哩哔哩视频 目前主要看了训练笔记系列 郑思维-哔哩哔哩_bilibili 所有的羽球思维视频都看了 羽毛球汤老师的个人空间-羽毛球汤老师个人主页-哔哩哔哩视频 羽毛球教练 黄广益羽球的个人空间-黄广益羽球个人主页-哔哩哔哩视频 B站上关注与播放都不多,但是有些视频给我的实战解惑了 羽毛球技巧 - YouTube 刘辉羽毛球视频专辑-刘辉羽毛球视频合集-哔哩哔哩视频 最近一直在看的,讲技术还讲原理 招式 杀球 杀斜线身体最好朝向对角线方向 跳杀时是略向前跳 杀球时要想象在是比赛 右脚的势能转移到左脚上(并步运动) 高远 向上将球推出的感觉 击球点头顶正上方 球拍接触球前所积蓄的力量,是打远距离和高强度的重要因素 反手 运动同时加入扭转,一边蓄力一边移动 练习 反手最大限度扔羽毛球 平高球 在对方已经站好接杀位置时压对方到后场 吊球 摆好准备姿势比杀球和高远球更重要 劈吊 动作和打杀球一样 在学好吊对角线后再来学 挑球 脚尖对准来球方向 躯干与跨步的稳定性更重要 挺胸直背 迈步时躯干的强度及骨盆的灵活性 正手 球拍由下向上挥非常重要 反手 握拍时,拇指一定要坚起来,挥拍感觉由下向上扫 击球时,感觉是拇指将球推出 放网前球 球拍向身体正前方抬起 球拍高度与网上面的白布条一致 球拍向上托的感觉 反手放网前球比正手击球时要略低,击球前最好左脚后蹬来提高击球高度 TODO 网前平搓 要点 搓击幅度要小 推球 球拍向上举起,向网前移动 击球时蹬地起跳,出拍迎球 只靠手腕力量击球的感觉 击球后身体不要过渡前倾,为下一拍做准备 双打比赛前场推球不能直接得分要做好多拍准备 扣杀 吊球 轻吊 收吊 滑拍吊 劈吊 拦吊 接发球 应对对方强杀 重点:拍面与来球方向一致 接发球前骨盆前屈,是强有力接球的主要原因 从身体发力 小指的练习非常重要 正手 重心在左脚拇指上,不要抬脚后跟 借力打力 在拍面与球网平行的位置击球 身体重心迅速跟进 在身体的正面击球 利用膝盖的屈伸力量 反手 向后撤拍 球和身体的距离不长于一个球拍的长度就用反手 在拍面与球网平行的位置击球 身体重心迅速跟进 要大幅度挥拍,尽可能往远打 建议 接发球不能形成对打,则可以放慢球速 ...

December 12, 2024 · 1 min · 176 words · tomyli

近期收集的关于健康的知识与好物品

AnsonZnl/RehabilitationGuide: 颈椎病腰突康复指南,为程序员群体提供简单可靠的康复指南。 zijie0/HumanSystemOptimization: 健康学习到150岁 - 人体系统调优不完全指南 京东京造即食型益生菌粉 每两年更换一次枕头,床单每周至少清洗一次 中餐烹饪中,实际上橄榄油没有精炼芥菜籽油(市面上绝大多数芥菜籽油)耐高温和稳定。 健身APP首推:训记–详细的动作教程与训练记录;书籍优选:肌力训练图解圣经-京东外文书店有售–彩色印刷,图解每一个动作训练到的肌肉和拉伸教程 健身有以上两项既可,有钱还可以请一个月的私教指导一下动作细节既可。 早起不要刷牙,先咽口水补充肠道菌群 因为晚上细菌会在口腔内为繁殖,吞入后可以补充菌群。 血糖平衡 餐前喝兑水的醋(苹果醋)或者柠檬水,来减缓食物分解速度 定时轮换站着和坐着。最好坐着工作每20到30分钟,就站起来运动1-2分钟

December 9, 2024 · 1 min · 16 words · tomyli

这些年收集的好物

NuPhy Air75 已入,用着舒服 亚朵深睡枕 pro 2.0 神秘农场 2 Day Assault 背包 液体创可贴 无印良品搓澡泥: 植萃去角质磨砂膏 Dawn Power Wash清洁 纳米布 迪卡龙速干短袖 地平线8号旅行箱 优衣库平替袜子 https://detail.1688.com/offer/737558590589.html 上海博友指甲刀 https://s.click.taobao.com/JF8rn3u Ubnt 的 ER-X千兆路由 AOC AM400P 显示器支架 迪卡侬浴巾 stanley 折叠推车 鞋 lululemon blissfell2 手机壳 tb启歌旗舰店的无边框手机壳,手感是真的好,媳妇和我各一个 蔚来交流慢充充电器 话说国内能用的智能监控摄像头,有啥推荐的品牌吗?不泄漏隐私的那种。除了小米。 随便找个支持rtsp的,在路由器把公网出口禁止了就行了 神秘农场 2 Day Assault 包 店铺 棉先生 重新加载 马登工装

December 5, 2024 · 1 min · 50 words · tomyli

收集有用的Prompts

can you visualize this? 如果对一个概念不是很拿的准。想让它画图,又不知道能画什么图,直接给他个最模糊的指令,visualize视觉化 explain the answers in narration 将答案用段落写出来 用逐渐增加复杂度的方式解释 XXX 先别写代码,先跟我讨论一下方案 适合只讨论方案 在输出的时候遵循“业界最佳实践” 书面表达 Your role is to be an English guru, an expert in authentic American English, who assists users in expressing their thoughts clearly and fluently. You are not just translating words; you are delving into the essence of the user’s message and reconstructing it in a way that maintains logical clarity and coherence. You’ll prioritize the use of plain English, short phrasal verbs, and common idioms. It’s important to craft sentences with varied lengths to create a natural rhythm and flow, making the language sound smooth and engaging. Avoid regional expressions or idioms that are too unique or restricted to specific areas. Your goal is to make American English accessible and appealing to a broad audience, helping users communicate effectively in a style that resonates with a wide range of English speakers. ...

November 1, 2024 · 2 min · 238 words · tomyli