springmvc 全局异常处理 and 拦截器
文章目录配置类 SpringMvcInit配置类 MvcConfig全局异常处理器User实体类 (参数校验)UserController拦截器 MyInterceptor拦截器 MyInterceptor1配置类 SpringMvcInitpackagecom.cool.config;importorg.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;可以被 web项目加载会初始化ioc容器会设置 dispatcherServlet的地址publicclassSpringMvcInitextendsAbstractAnnotationConfigDispatcherServletInitializer{OverrideprotectedClass?[]getRootConfigClasses(){returnnewClass[0];}设置配置类OverrideprotectedClass?[]getServletConfigClasses(){returnnewClass[]{MvcConfig.class};}配置springmvc内部自带servlet的访问地址OverrideprotectedString[]getServletMappings(){returnnewString[]{/};}}配置类 MvcConfigpackagecom.cool.config;importcom.cool.interceptor.MyInterceptor;importcom.cool.interceptor.MyInterceptor1;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;importorg.springframework.web.servlet.config.annotation.EnableWebMvc;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;EnableWebMvcConfigurationComponentScan({com.cool.controller,com.cool.error})publicclassMvcConfigimplementsWebMvcConfigurer{/* 通过configurer.enable()启用默认Servlet处理。 当请求无法匹配到Spring的控制器时会回退到Servlet容器的默认Servlet如Tomcat的DefaultServlet 主要用于处理静态资源如HTML、JS、CSS。 典型场景 配置后对 /static/** 的请求会先由Spring处理未匹配则交给容器默认Servlet */OverridepublicvoidconfigureDefaultServletHandling(DefaultServletHandlerConfigurerconfigurer){configurer.enable();}OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 配置方案-1拦截全部请求registry.addInterceptor(newMyInterceptor());// 配置方案-2拦截指定的请求// *任意一层字符串**任意多层字符串registry.addInterceptor(newMyInterceptor()).addPathPatterns(/user/**);// 拦截 user/ 下的所有请求// 配置方案-3排除拦截// 拦截 user/ 下除了 /user/data1 之外的请求地址registry.addInterceptor(newMyInterceptor()).addPathPatterns(/user/**).excludePathPatterns(/user/data1);// 如果有多个拦截器执行流程是怎样的呢/* 先声明的优先级高优先级高的在外层 MyInterceptor.preHandle MyInterceptor1.preHandle OrderController.data MyInterceptor1.postHandle MyInterceptor.postHandle MyInterceptor1.afterCompletion MyInterceptor.afterCompletion */registry.addInterceptor(newMyInterceptor());registry.addInterceptor(newMyInterceptor1());}}全局异常处理器全局异常处理器 GlobalException 使用了 RestControllerAdvice处理 ArithmeticException 和 Exception。当 Controller 中的方法抛出这些异常时会被对应的 ExceptionHandler 方法捕获并处理。packagecom.cool.error;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;/** * 全局异常处理器 * * ControllerAdvice * 作用全局异常发生就会走此类的方法可以返回 逻辑视图、转发、重定向 * * RestControllerAdvice * 相当于 ControllerAdvice 和 ResponseBody 的组合 * 可以直接返回 json 字符串 * */RestControllerAdvicepublicclassGlobalException{/* 发生异常后 - ControllerAdvice注解的类型 - ExceptionHandler(指定的异常) - 执行handler 如果没有找到指定的异常就会找父类Exception */精准匹配算术异常ExceptionHandler(ArithmeticException.class)publicObjectArithmeticExceptionHandler(ArithmeticExceptione){// 自定义异常处理即可Stringmessagee.getMessage();System.out.println(ArithmeticExceptionHandlermessage);returnmessage;}兜底所有异常ExceptionHandler(Exception.class)publicObjectExceptionHandler(Exceptione){Stringmessagee.getMessage();System.out.println(ExceptionHandlermessage);returnmessage;}}User实体类 (参数校验)packagecom.cool.pojo;importjakarta.validation.constraints.Email;importjakarta.validation.constraints.Min;importjakarta.validation.constraints.NotBlank;importjakarta.validation.constraints.Past;importlombok.Data;importorg.hibernate.validator.constraints.Length;importjava.util.Date;/** * name不为null、不为空字符串 * 字符串不为空NotBlank * 集合不为空NotEmpty * 包装类型不为空NotNull * * password长度大于6 */DatapublicclassUser{NotBlankprivateStringname;Length(min6,max20)privateStringpassword;Min(1)privateintage;EmailprivateStringemail;PastprivateDatebirthday;}UserControllerpackagecom.cool.controller;importcom.cool.pojo.User;importorg.springframework.validation.BindingResult;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjava.util.HashMap;importjava.util.Map;RestControllerRequestMapping(user)publicclassUserController{/** * 步骤1实体类属性添加校验注解 * 步骤2handler(Validated 实体类对象){} * 细节 * param、json 校验注解都有效果 * 只不过json参数的话需要用 RequestBody 修饰形参哦 * * 这里有个天坑如果不符合校验规则会直接向前端抛出异常 * 解决办法 * handler(Validated 实体类对象, BindingResult request){} * 多加一个 BindingResult request 参数 * 此参数必须紧挨着 Validated 实体类对象否则此参数不管用 */PostMapping(register)publicObjectregister(ValidatedRequestBodyUseruser,BindingResultresult){System.out.println(user user);if(result.hasErrors()){// 有错误的话就不直接返回给前端了可以在这里自定义内容返回给前端MapdatanewHashMap();data.put(code,400);data.put(msg,参数校验异常);returndata;}returnuser;}GetMapping(data)publicStringdata(){// 这个方法做成空指针异常Stringnamenull;name.toString();// NullPointerException报错后就不会执行下面的代码了就会取异常处理那里returndata - ok;}GetMapping(data1)publicStringdata1(){// 这个方法做成算数异常inti1/0;// ArithmeticException: / by zeroreturndata1 - ok;}}拦截器 MyInterceptorpackagecom.cool.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;/** * 声明好这个类之后 * 需要在 MvcConfig 类中注册上 */publicclassMyInterceptorimplementsHandlerInterceptor{/** * handler执行之前触发 * param request 请求对象 * param response 响应对象 * param handler 就是我们要调用的方法对象 * return true放行false拦截 * throws Exception */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(request request,response response,handler handler);System.out.println(MyInterceptor.preHandle);returntrue;}/** * 当 handler 执行完毕后触发此方法没有拦截机制了 * 此方法只有在 preHandle方法 return true 的时候才会被执行 * param request * param response * param handler * param modelAndView 返回的视图和共享域的数据对象如果没有的话返回null * throws Exception * * 对 响应结果 的处理 * */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(MyInterceptor.postHandle);}/** * 整体处理完毕后会触发这个方法 * param request * param response * param handler * param ex 如果 handler方法报错了这个参数就是异常对象 * throws Exception */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(MyInterceptor.afterCompletion);}}拦截器 MyInterceptor1packagecom.cool.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;/** * 声明好这个类之后 * 需要在 MvcConfig 类中注册上 */publicclassMyInterceptor1implementsHandlerInterceptor{/** * handler执行之前触发 * param request 请求对象 * param response 响应对象 * param handler 就是我们要调用的方法对象 * return true放行false拦截 * throws Exception */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(MyInterceptor1.preHandle);returntrue;}/** * 当 handler 执行完毕后触发此方法没有拦截机制了 * 此方法只有在 preHandle方法 return true 的时候才会被执行 * param request * param response * param handler * param modelAndView 返回的视图和共享域的数据对象如果没有的话返回null * throws Exception * * 对 响应结果 的处理 * */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(MyInterceptor1.postHandle);}/** * 整体处理完毕后会触发这个方法 * param request * param response * param handler * param ex 如果 handler方法报错了这个参数就是异常对象 * throws Exception */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(MyInterceptor1.afterCompletion);}}

相关新闻

springmvc 参数校验

springmvc 参数校验

在 Web 应用三层架构体系中,表述层负责接收浏览器提交的数据,我们需要在表述层对数据进行检查,将错误的数据隔绝在业务逻辑层之外。 校验概述 JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 标准…

2026/7/7 8:46:10 阅读更多 →
基于spring+vue的校园勤工俭学平台[spring]-计算机毕业设计源码+LW文档

基于spring+vue的校园勤工俭学平台[spring]-计算机毕业设计源码+LW文档

摘要:校园勤工俭学作为学生参与社会实践、提升自身能力的重要途径,在高校中广泛开展。为了提高校园勤工俭学管理的效率和透明度,本文设计并实现了基于SpringVue的校园勤工俭学平台。该平台利用Spring框架构建稳定可靠的后端服务,采…

2026/7/3 18:52:26 阅读更多 →
计算机毕业设计springboot飞羽羽毛球俱乐部管理系统 基于SpringBoot的羽球馆综合运营平台 SpringBoot驱动的羽毛球会所活动与场地预约系统

计算机毕业设计springboot飞羽羽毛球俱乐部管理系统 基于SpringBoot的羽球馆综合运营平台 SpringBoot驱动的羽毛球会所活动与场地预约系统

计算机毕业设计springboot飞羽羽毛球俱乐部管理系统(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。羽毛球馆每天高峰期都要接几十通电话预约场地,纸质登记本翻来翻去…

2026/7/9 3:57:35 阅读更多 →

最新新闻

你的LLM应用正在 silently fail?GPT-5的tool-calling容错率为83.1%,Claude Fable 5达96.4%——27个生产环境故障案例归因分析(限首批读者下载)

你的LLM应用正在 silently fail?GPT-5的tool-calling容错率为83.1%,Claude Fable 5达96.4%——27个生产环境故障案例归因分析(限首批读者下载)

更多请点击: https://intelliparadigm.com 第一章:你的LLM应用正在 silently fail? 当用户输入“帮我写一封辞职信”,模型却返回一段无关的 Python 代码;当客服对话系统在高并发下响应延迟飙升至 8 秒,日志…

2026/7/9 6:17:29 阅读更多 →
计算机毕业设计之面向智慧校园社区的班级管理系统

计算机毕业设计之面向智慧校园社区的班级管理系统

伴随着社会以及科学技术的发展,互联网已经渗透在人们的身边,网络慢慢的变成了人们的生活必不可少的一部分,紧接着网络飞速的发展,管理系统这一名词已不陌生,越来越多的学校、公司等机构都会定制一款属于自己个性化的管…

2026/7/9 6:17:29 阅读更多 →
不受限制的私域沟通工具|海王IM私有化部署解决方案

不受限制的私域沟通工具|海王IM私有化部署解决方案

什么是私有化IM系统定制开发 企业需要一套完全由自己掌控的即时通讯系统时,海王IM私有化部署方案就是答案。私有化IM系统定制开发,指的是将IM软件的源码或核心组件部署在企业自己的服务器上,并根据业务需求进行功能修改、界面定制、系统集成…

2026/7/9 6:15:29 阅读更多 →
粉笔OMO模式解析:线上线下打通,数据闭环怎么玩?

粉笔OMO模式解析:线上线下打通,数据闭环怎么玩?

核心结论:粉笔的OMO(Online-Merge-Offline)模式是公考培训行业"线上技术线下体验"融合的代表性案例。其核心逻辑是:线上承担"内容交付数据采集AI辅助"的功能,线下承担"学习氛围互动答疑模拟实…

2026/7/9 6:13:28 阅读更多 →
学生最常用的AI软件怎么选

学生最常用的AI软件怎么选

学生群体用AI,核心需求很明确:免费额度够用、零基础能上手、中文回答自然、能覆盖学习与创作场景,还能适配课程作业、论文、项目、复习等不同任务。下面从主流AI软件出发,结合学生高频使用场景,聊聊每款工具的真实定位…

2026/7/9 6:07:27 阅读更多 →
2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评

2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评

今天给大家带来2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评。据WeChat Mini Program Development Guide 2025数据显示,截至2024年微信小程序总数已突破430万个,95%的中国企业拥有自己的小程序;腾讯控股2025年财报…

2026/7/9 6:07:27 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻