问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot全局异常处理器的简单使用

创作时间:
作者:
@小白创作中心

SpringBoot全局异常处理器的简单使用

引用
CSDN
1.
https://blog.csdn.net/weixin_74004976/article/details/139390252

Spring Boot全局异常处理器是Java Web应用中处理所有未捕获异常的重要组件。它可以帮助我们在发生异常时进行统一的错误处理和友好的提示,避免直接向用户展示技术细节。本文将详细介绍全局异常处理器的概念、作用以及具体的实现步骤和代码示例。

SpringBoot全局异常处理器

什么是全局异常处理器

  • 全局异常处理器(Global Exception Handler)是一个在Java Web应用中处理所有未捕获异常的 handler。它可以帮助我们在发生异常时进行统一的错误处理和友好的提示,避免直接向用户展示技术细节。
  • 在Spring Boot中,我们可以通过@ControllerAdvice和@ExceptionHandler注解来实现全局异常处理器

为什么要使用全局异常处理器

  1. 统一处理:全局异常处理器可以集中处理应用程序中所有未捕获的异常,这样可以避免在各个地方重复处理相同的异常逻辑,提高代码的整洁性和可维护性。
  2. 错误信息:通过全局处理器,可以提供一致的错误信息给用户,即使在发生复杂的错误时,也能给出清晰的错误提示,提升用户体验。
  3. 日志记录:全局处理器可以捕获所有异常,方便开发者在后台进行详细的日志记录,有助于问题排查和追踪。
  4. 错误统计:处理异常时,可以收集和统计不同类型的异常,用于性能监控和系统健康度检查。
  5. 异常转跳:全局处理器可以控制异常发生时的页面跳转,比如跳转到错误页面、重定向到登录页面等,根据应用需求进行定制。
  6. API友好:对于API服务,全局异常处理器可以处理HTTP异常,返回统一的HTTP状态码和错误信息,保持API的稳定性和一致性。

简单的演示案例

  • 首先我们创建基础异常类
public class BaseException extends RuntimeException{
    public BaseException() {
    }
    public BaseException(String message) {
        super(message);
    }
}  
  • 我们用自定义异常类(起名要见名知意)来继承基础异常类
public class UsernameNotNull extends BaseException{
    public UsernameNotNull() {
    }
    public UsernameNotNull(String message) {
        super(message);
    }
}  
  • 配置全局异常处理器
import com.example.exception.BaseException;
import com.example.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.info("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }
}  

测试

  • Controller模拟实现
import com.example.dto.UserLoginDTO;
import com.example.exception.UsernameNotNull;
import com.example.properties.JwtProperties;
import com.example.result.Result;
import com.example.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private JwtProperties jwtProperties;
    @PostMapping("/login")
    public Result<String> login(@RequestBody UserLoginDTO userLoginDTO){
        //这里不再书写业务层和数据库层,而是进行模拟
        String nameDB = "hyt";
        String passwordDB = "123456";
        String name = userLoginDTO.getName();
        String password = userLoginDTO.getPassword();
        //进行简单的全局异常模拟
        if (name.isEmpty()){
            throw new UsernameNotNull("名字不能为空(自定义)");
        }
        if(name.equals(nameDB) && password.equals(passwordDB)){
            Map<String, Object> claims = new HashMap<>();
            //这里id我随机生成,在真实业务时是通过数据过查询得到的
            Random random = new Random();
            claims.put("userId", random.nextInt(100));
            String token = JwtUtil.createJwt(
                claims, jwtProperties.getAdminTtl(),
                jwtProperties.getSecretKey());
            //按照前后联调一致格式返回
            return Result.success(token);
        }
        return Result.error("密码错误");
    }
}
  • 正常情况下

  • 当我们用户名为空,可以看到确实对异常进行了处理


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号