【JavaEE】Spring(7):统一功能处理

news/2025/2/5 0:42:45/


一、拦截器

拦截器的使用步骤:

  1. 定义拦截器
  2. 注册配置拦截器

1. 定义拦截器

java">@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("目标方法执行前执行");return true;
}

preHandle是HandlerInterceptor接口提供的方法,该方法用来判断目标方法执行前是否要拦截,返回true就不拦截,即目标方法可以执行,返回false就拦截,即目标方法禁止执行

2. 配置注册拦截器

java">@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login").excludePathPatterns("/css/**").excludePathPatterns("/js/**").excludePathPatterns("/pic/**").excludePathPatterns("/**/*.html").excludePathPatterns("/test/**");}
}

二、统一数据返回格式

在进行项目开发时,我们通常将后端返回给前端的数据做一个包装,使得让返回的数据格式都相同

java">@Data
public class Result<T> {private ResultCodeEnum code;private String errMsg;private T data; //包装前,接口返回的数据
}

那么如何将数据进行包装:

java">@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType, ServerHttpRequestrequest, ServerHttpResponse response) {return Result.success(body);}
}

当一个Controller方法返回一个值时,该值会作为参数传递给supports方法;在supports方法中,通过我们自己编写的逻辑来判断是否需要对返回值进行处理,如果返回true,则将返回值传递给beforeBodyWrite方法,在beforeBodyWrite方法中对返回值进行处理,将处理后的格式作为响应发送给客户端

返回false就不执行beforeBodyWrite方法,即不对返回值进行处理,直接作为响应发送给客户端

三、统一异常处理

统一异常处理通过@ControllerAdvice + @ExceptionHandler 来实现

java">@ControllerAdvice
@ResponseBody
public class ErrorAdvice {@ExceptionHandlerpublic Object handler(Exception e) {return Result.fail(e.getMessage());}}

上述代码表示,如果代码中出现Exception异常(包括Exception子类),就返回一个Result对象,Result.fail(e.getMessage());方法实现如下:

java">public static <T> Result<T> fail(String errMsg){Result result = new Result<>();result.setErrMsg(errMsg);result.setCode(ResultCodeEnum.FAIL);result.setData(null);return result;
}

将Result对象转换为Json格式后返回给前端

如果想要针对不同的异常返回不同的结果,可以这么写:

java">@RestControllerAdvice //相当于@ResponseBody + @ControllerAdvice
public class ErrorAdvice {@ExceptionHandler(ArithmeticException.class) //针对算数异常public Result handler1(Exception e){log.error("发生ArithmeticException, e:", e);return Result.fail("发生算术异常: "+e.getMessage());}@ExceptionHandler(NullPointerException.class) //针对空指针异常public Result handler2(Exception e){log.error("发生NullPointerException, e:", e);return Result.fail("发生空指针异常: "+e.getMessage());}@ExceptionHandler(Exception.class)public Result handler3(Exception e){log.error("发生异常, e:", e);return Result.fail("发生异常: "+ e.getMessage());}
}

接下来模拟几个异常:

java">@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("/t1")public String t1(){int[] arr = {1,2,3};System.out.println(arr[5]);return "t1";}@RequestMapping("/t2")public Integer t2(){int a = 10/0;return 10;}@RequestMapping("/t3")public Boolean t3(){String a = null;System.out.println(a.length());return true;}}

http://127.0.0.1:8080/test/t1:

http://127.0.0.1:8080/test/t2:

http://127.0.0.1:8080/test/t3:


🙉本篇文章到此结束


http://www.ppmy.cn/news/1569371.html

相关文章

python算法和数据结构刷题[6]:二叉树、堆、BFS\DFS

遍历二叉树 前序遍历NLR&#xff1a;先访问根结点&#xff0c;再前序遍历左子树&#xff0c;最后前序遍历右子树。中序遍历LNR&#xff1a;先中序遍历左子树&#xff0c;再访问根结点&#xff0c;最后中序遍历右子树。后序遍历 LRN&#xff1a;先后序遍历左子树&#xff0c;再…

水瓶加水时的重心变化,MATLAB计算与可视化

空水瓶的重心靠近中部&#xff0c;水量少时&#xff0c;重心靠下&#xff0c;水满时重心又回到中间了。 本文给出一个用于计算水瓶加水过程中&#xff0c;整体的重心变化情况&#xff0c;并绘制可视化的曲线图、示意图 文章目录 重心高度计算总重心高度计算MATLAB 代码运行结果…

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…

深入解析 Chrome 浏览器的多进程架构:标签页是进程还是线程?(中英双语)

深入解析 Chrome 浏览器的多进程架构&#xff1a;标签页是进程还是线程&#xff1f; 1. 引言 Google Chrome 作为全球最流行的浏览器之一&#xff0c;以其稳定性、安全性和多任务处理能力而闻名。而其高效的表现&#xff0c;很大程度上归功于其独特的多进程架构&#xff08;M…

Java 9模块开发:IntelliJ IDEA实战指南

在Java 9中&#xff0c;模块化是一个重要的特性&#xff0c;它可以帮助我们更好地组织和管理代码。而IntelliJ IDEA作为一个强大的集成开发环境&#xff0c;为Java 9模块的开发提供了全面的支持。本文将通过一个实际的项目示例&#xff0c;详细讲解如何在IntelliJ IDEA中开发和…

TypeScript (TS) 和 JavaScript (JS)

TypeScript (TS) 和 JavaScript (JS) 的区别主要在于 TypeScript 是 JavaScript 的一个超集&#xff0c;它在 JavaScript 基础上增加了类型系统和一些高级功能。让我们详细看看两者的区别和关系&#xff1a; 类型系统&#xff1a; TypeScript 最大的特点是 静态类型。在 TypeSc…

Deep Sleep 96小时:一场没有硝烟的科技保卫战

2025年1月28日凌晨3点&#xff0c;当大多数人还沉浸在梦乡时&#xff0c;一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击&#xff0c;警报声响彻机房&#xff0c;一场针对中国关键信息基础设施的网络攻击来势汹汹&#xff01; 面对美国发起的这场…

2025年2月2日(tcp3次握手4次挥手)

TCP&#xff08;三次握手和四次挥手&#xff09;是建立和关闭网络连接的标准过程&#xff0c;确保数据在传输过程中可靠无误。下面是详细解释&#xff1a; 1. 三次握手&#xff08;TCP连接建立过程&#xff09; 三次握手是为了在客户端和服务器之间建立一个可靠的连接&#x…