我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

在上一篇文章中,苏南大叔描述了如果使用aspect切面文件分离验证逻辑的话。同时,也带来了一个小小的问题。那就是异常信息太多了,看起来很复杂不明确,繁杂信息太多。本文描述异常处理的一些方式。

苏南大叔:SpringBoot开发,使用ControllerAdvice全局捕获异常 - 全局异常捕获
SpringBoot开发,使用ControllerAdvice全局捕获异常(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10openjdk@23.0.2IntelliJ IDEA 2024.3.4.1maven@3.3.2spring boot@2.5.4java@17mysql@5.7.26

代码回顾

由于篇幅限制,本文仅以csrf验证为例,login验证是同理的。

没有使用aspect切面文件之前的代码写法及效果:

@PostMapping
public ResponseEntity<?> createUser(@RequestBody User user, HttpServletRequest request) {
    //...
    try {
        validateCsrfToken(request);
        return ResponseEntity.ok(userService.createUser(user));
    } catch (RuntimeException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}
Java

苏南大叔:SpringBoot开发,使用ControllerAdvice全局捕获异常 - 错误提示效果一
SpringBoot开发,使用ControllerAdvice全局捕获异常(图4-2)

参考文章:

使用aspect切面文件之后的代码写法及效果:

@Before("execution(* com.example.demo.controller.UserController.*(..))")
public void checkCsrfToken() {
    //...
    if (sessionCsrfToken == null || !sessionCsrfToken.equals(requestCsrfToken)) {
        throw new RuntimeException("CSRF token 验证失败");
    }
}
Java

苏南大叔:SpringBoot开发,使用ControllerAdvice全局捕获异常 - 运行提示效果二
SpringBoot开发,使用ControllerAdvice全局捕获异常(图4-3)

这主要是因为aspect相关验证,使用Before定义在Controller方法之前执行了。相关方法内的异常捕获逻辑,并不能做到捕获。

参考文章:

全局异常捕获

基于springbootaop框架,建立一个ControllerAdvice类型的文件。

记得安装依赖spring-boot-starter-aop

src/main/java/com/example/demo/controller/GlobalExceptionHandler.java

package com.example.demo.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleRuntimeException(RuntimeException e) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}
Java

苏南大叔:SpringBoot开发,使用ControllerAdvice全局捕获异常 - 运行效果三
SpringBoot开发,使用ControllerAdvice全局捕获异常(图4-4)

这样就可以像以前一样,简化输出提示了。值得一提的是:这个全局异常捕获的补丁,依然是个搭积木效果。移除这个文件并不会报错,只是效果消失而已。

结语

本文讲述使用aop中的advice思想,添加一个全局异常捕获的功能,修改了结果输出内容。更多苏南大叔的java相关经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   java