springmvc 全局异常处理 and 拦截器

文章目录

    • 配置类 SpringMvcInit
    • 配置类 MvcConfig
      • 全局异常处理器
      • User实体类 (参数校验)
      • UserController
      • 拦截器 MyInterceptor
      • 拦截器 MyInterceptor1

配置类 SpringMvcInit

packagecom.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[]{"/"};}}

配置类 MvcConfig

packagecom.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;@EnableWebMvc@Configuration@ComponentScan({"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){// 自定义异常处理即可Stringmessage=e.getMessage();System.out.println("ArithmeticExceptionHandler="+message);returnmessage;}"兜底所有异常"@ExceptionHandler(Exception.class)publicObjectExceptionHandler(Exceptione){Stringmessage=e.getMessage();System.out.println("ExceptionHandler="+message);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(min=6,max=20)privateStringpassword;@Min(1)privateintage;@EmailprivateStringemail;@PastprivateDatebirthday;}

UserController

packagecom.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;@RestController@RequestMapping("user")publicclassUserController{/** * 步骤1:实体类属性添加校验注解 * 步骤2:handler(@Validated 实体类对象){} * 细节: * param、json 校验注解都有效果 * 只不过,json参数的话,需要用 @RequestBody 修饰形参哦! * * 这里有个天坑:如果不符合校验规则,会直接向前端抛出异常 * 解决办法: * handler(@Validated 实体类对象, BindingResult request){} * 多加一个 BindingResult request 参数, * 此参数,必须紧挨着 @Validated 实体类对象,否则此参数不管用 */@PostMapping("register")publicObjectregister(@Validated@RequestBodyUseruser,BindingResultresult){System.out.println("user= "+user);if(result.hasErrors()){// 有错误的话,就不直接返回给前端了,可以在这里自定义内容,返回给前端Mapdata=newHashMap();data.put("code",400);data.put("msg","参数校验异常");returndata;}returnuser;}@GetMapping("data")publicStringdata(){// 这个方法,做成,空指针异常Stringname=null;name.toString();// NullPointerException,报错后,就不会执行下面的代码了,就会取异常处理那里return"data - ok";}@GetMapping("data1")publicStringdata1(){// 这个方法,做成,算数异常inti=1/0;// ArithmeticException: / by zeroreturn"data1 - ok";}}

拦截器 MyInterceptor

packagecom.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");}}

拦截器 MyInterceptor1

packagecom.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");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1220408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 驱动开发】六. 中断和阻塞/非阻塞IO的实现

中断和阻塞/非阻塞IO的实现 1. 中断1.1 概念1.1.1 中断源的概念 1.2 设备树中描述中断信息1.3 中断实例---以按键为例1.3.1 在设备树中添加结点1.3.2 驱动实现 1.4 使用gpio子系统实现中断处理1.4.1 旧的gpio方式1.4.2 新的gpio方式 2. 阻塞IO和非阻塞IO的实现2.1 阻塞IO的实现…

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

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

基于SpringBoot的社区医疗服务管理小程序的设计与开发(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计并开发一套基于SpringBoot框架与微信小程序的社区医疗服务管理系统&#xff0c;破解社区居民就医挂号繁琐、健康咨询不便、医疗资源对接不及时、健康档案分散等痛点&#xff0c;搭建高效便捷的移动端社区医疗服务平台。系统采用前后端分离架构&#xff…

计算机毕业设计springboot飞机票预定系统 基于SpringBoot的航班在线预订平台 SpringBoot驱动的民航电子客票销售系统

计算机毕业设计springboot飞机票预定系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。春运、暑运、黄金周&#xff0c;机票查询量瞬间爆炸&#xff0c;电话占线、窗口排队、代…

基于SpringBoot的扶贫助农系统及其小程序的实现(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在开发一套基于SpringBoot框架与微信小程序的扶贫助农系统&#xff0c;破解传统农产品流通不畅、产销对接断层、扶贫数据难追踪等痛点&#xff0c;搭建农户与消费者直接对接的数字化桥梁。系统采用前后端分离架构&#xff0c;后端以SpringBoot为核心&#xff…

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

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

基于SpringBoot的健康管理微信小程序的设计与实现(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计并实现一套基于SpringBoot框架与微信小程序的健康管理系统&#xff0c;破解个人健康数据零散、健康服务触达不便、个性化管理缺失等痛点&#xff0c;搭建便捷高效的移动端健康管理平台。系统采用前后端分离架构&#xff0c;后端以SpringBoot为核心&…

基于SpringBoot的旅游线路定制微信小程序(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计并实现一套基于SpringBoot框架与微信小程序的旅游线路定制系统&#xff0c;破解传统旅游线路同质化严重、个性化需求难满足、行程规划繁琐等痛点&#xff0c;搭建高效便捷的移动端旅游服务平台。系统采用前后端分离架构&#xff0c;后端以SpringBoot为核…

计算机毕业设计springboot飞机票订票管理系统 基于SpringBoot的航空客运票务管理平台 SpringBoot驱动的在线航班预订与订单管理系统

计算机毕业设计springboot飞机票订票管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 航空出行已成为大众首选&#xff0c;但传统人工售票、电话占线、信息滞后等痛点依…

2026最新益气健脾滋补品/益气健脾保健品/益气健脾口服液企业推荐复方红衣补血口服液:传承创新,这家老字号实力引领

在现代快节奏生活中,人们对健康的重视程度日益提升,益气健脾类产品成为众多人群调养身体的重要选择。2026年,翔宇药业股份有限公司(简称“翔宇药业”)凭借其旗下核心产品复方红衣补血口服液,在益气健脾滋补品、保…

AsyPPO_ 轻量级mini-critics如何提升大语言模型推理能力 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电脑加密软件应该怎么选择?六款电脑加密软件推荐(建议收藏)

怕文件泄密&#xff1f;电脑加密软件选对才安心&#xff01;想避开选型陷阱&#xff0c;选到合规又好用的工具&#xff1f;2026 实测 6 款高适配软件&#xff0c;从功能到场景全解析&#xff0c;帮你少走弯路。一、互成软件核心优势定位&#xff1a;终端安全一体化解决方案领军…

链家二手房数据爬取、聚类分析与可视化展示实践

一、项目技术框架与环境准备 本次实践的核心目标是完成 “数据获取 - 数据预处理 - 聚类分析 - 可视化展示” 的全流程闭环&#xff0c;技术选型围绕 Python 生态的成熟工具展开&#xff0c;兼顾开发效率和实战效果。 1.1 核心技术工具 数据爬取&#xff1a;Requests&#x…

MySQL UDF 一例

目录 1. 功能 2. des_encrypt.cc 代码 3. 使用动态库编译 4. 复制到 MySQL 插件目录 5. 重启 MySQL 6. 创建函数并调用执行 1. 功能 在 MySQL 中实现 DES/ECB/PKCS5Padding 加密算法。 2. des_encrypt.cc 代码 #include <stdio.h> #include <stdlib.h> #in…

IK-M20的体验

IK-M20的体验IK-M20的体验设备参数CPU: MEDIATEK MT7628NN RAM 128MB: winbond W971GG6SB-25 FLASH 32MB: MXIC MX25L25635FMI-10G 16脚 设备是5口百兆,没有无线,5个网口灯,一个系统灯,一个网络状态灯,一个电源指…

VRRP:智算中心网络高可用的关键技术

VRRP协议概述VRRP (Virtual Router Redundancy Protocol) 是一种旨在解决局域网内默认网关单点故障问题的容错协议。通过 VRRP&#xff0c;多台物理路由器或交换机可以逻辑上聚合为一个“虚拟路由器”&#xff0c;并对外统一提供一个虚拟 IP (VIP)。对于终端设备&#xff08;如…

Python包管理|如何解决 pip install requests[socks] 报错:zsh:1: no matches found: requests[socks] 问题

摘要 你想解决在zsh终端中执行pip install requests[socks]时&#xff0c;抛出zsh:1: no matches found: requests[socks]错误的问题。这个错误并非pip或requests包的问题&#xff0c;核心根源是zsh的文件名扩展&#xff08;Globbing&#xff09;机制——zsh会将中括号[]解析为…

如何解决 pip install 与 PyCharm 解释器版本不一致导致导入失败问题

摘要 你想解决因pip install安装包时使用的Python解释器&#xff0c;与PyCharm项目配置的解释器版本/路径不一致&#xff0c;导致在PyCharm中导入包提示ModuleNotFoundError或“Unresolved reference”的问题。这个问题是Python开发中新手高频踩坑点——核心根源是PyCharm的项…

如何解决 pip install 导入失败 因 PYTHONPATH 污染(本地同名包遮蔽)问题

摘要 你想解决因PYTHONPATH环境变量配置异常&#xff08;路径优先级过高&#xff09; 或项目目录下存在与第三方包同名的文件/目录&#xff0c;导致pip安装的第三方包被“遮蔽”&#xff0c;导入时提示ModuleNotFoundError、导入错误模块&#xff08;如本地同名文件&#xff0…

Python系列环境兼容|如何解决 pip install 平台报错 GLIBC_2.64 not found(manylinux 与系统不兼容)问题

摘要 你想解决在Linux系统下执行pip install时&#xff0c;因第三方包的预编译manylinux版本依赖高版本GLIBC&#xff08;如2.64&#xff09;&#xff0c;而你的系统GLIBC版本过低&#xff08;如CentOS 7的2.17、Ubuntu 18.04的2.27&#xff09;&#xff0c;导致报错ImportErr…