首页 > 其他分享 >Spring全局异常

Spring全局异常

时间:2024-03-25 00:00:02浏览次数:23  
标签:ErrorCode Spring errorCode org import 全局 异常 public

前言

最近做一个spring微服务,当请求进入接口后,一旦发生错误,服务就会抛出异常,但是这个异常不是我们封装的,有时候跑出的信息我们想统一处理。
例:如果是客户请求数据错误应该报出400的HttpStatus.BAD_REQUEST。但是由于这个错误是我们内部抛出的他还是会自动抛500,而且服务有很多接口,我们管理也不方便。所以需要一个全局的异常处理。
 

1. 全局异常设置

我们这里设置两种异常,一种是客户请求的问题我们将他全都归为ClientRequestException 异常,我们服务内部的异常我们全都将它归为服务自身异常MyServiceRuntimeException。 

1.1. 自定义客户请求异常

如请求数据错误。

import lombok.Data;

@Data
public class ClientRequestException extends RuntimeException {
    private ErrorCode errorCode;

    public ClientRequestException(ErrorCode errorCode, String appendMsg){
        super(errorCode.getMsg()+" : "+appendMsg);
        this.errorCode = errorCode;
    }

}
1.2. 定义服务端内部异常

如JDBC链接超时。

import lombok.Data;

@Data
public class MyServiceRuntimeException extends RuntimeException {
    private ErrorCode errorCode;

    public MyServiceRuntimeException(ErrorCode errorCode, String appendMsg){
        super(errorCode.getMsg()+" : "+appendMsg);
        this.errorCode = errorCode;
    }

}
1.3. 定义error code  

定义自定义的统一管理的细致的error code。

public enum ErrorCode {
    SYSTEM_ERROR("500-001","System error"),
    SYSTEM_JDBC_CONNECTION_ERROR("500-002","System JDBC connection error"),
    CLIENT_REQUEST_DATA_ERROR("400-001","request Data error");
    private String code;
    private String msg;

    ErrorCode(String code,String msg){
        this.code = code;
        this.msg = msg;
    }

    public String getCode(){
        return code;
    }

    public String getMsg(){
        return msg;
    }
}
1.5.定义全局异常处理类

如下需要用到 @RestControllerAdvice 和 @ExceptionHandler注解分别标注,和写明不同异常的处理方法和报错的归类,

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

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MyServiceRuntimeException.class)
    public ResponseEntity<ResponseException> myServiceRuntimeException(MyServiceRuntimeException ex){
        ErrorCode errorCode = ex.getErrorCode();
        ResponseException responseException = new ResponseException(errorCode.getCode(),ex.getMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseException);
    }

    @ExceptionHandler(ClientRequestException.class)
    public ResponseEntity<ResponseException> myClientRuntimeException(ClientRequestException ex){
        ErrorCode errorCode = ex.getErrorCode();
        ResponseException responseException = new ResponseException(errorCode.getCode(),ex.getMessage());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseException);
    }
}
1.6. 自定义注解和AOP

定义AOP用于注解哪些类需要相同的异常处理。 这里仅定义给可能发生JDBC链接异常的所有API使用。客户端数据异常不使用注解(因为只有一接口会有数据检查,没必要做一个切面给他)

package com.acom.springdemo.exception.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CommonExceptionHandler {
}

//第二个class
import com.acom.springdemo.exception.ErrorCode;
import com.acom.springdemo.exception.MyServiceRuntimeException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.transaction.CannotCreateTransactionException;
@Aspect
@Component
public class CommonExceptionHandlerAspect {
    @Around("@annotation(com.acom.springdemo.exception.aop.CommonExceptionHandler)")
    public void commonExceptionHandle(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        try{
            proceedingJoinPoint.proceed();
        }catch (CannotCreateTransactionException ex){
            throw new MyServiceRuntimeException(ErrorCode.SYSTEM_JDBC_CONNECTION_ERROR,ex.getCause().getMessage());
        }
    }
}

2.使用全局异常

2.1. 服务自身异常使用 

如上由于我们对JDBC异常(commonExceptionHandle)新建了注解,所以我们只需要将这个注解加在我们想监控的类上就可以了。

当服务内部出现JDBC链接异常就会有如下异常流程

  • 发生JDBC链接异常Spring框架内部抛出CannotCreateTransactionException
  • 进入自定义注解@CommonExceptionHandler内部代码
  • 注解内部代码捕获后在抛出自定义MyServiceRuntimeException异常
  • MyServiceRuntimeException异常被全局异常统一处理后抛出

2.2. 客户请求数据异常

 假如id==333L就表示数据不对。

服务抛出400异常

该异常流程:

  • 自我的服务发现数据不符合规定,抛出自定 ClientRequestException异常
  • ClientRequestException异常被全局异常捕获,并相应400和自定义的异常信息

标签:ErrorCode,Spring,errorCode,org,import,全局,异常,public
From: https://blog.csdn.net/m0_59276831/article/details/136997640

相关文章

  • 简单好用轻量的GIF录制软件——配合全局鼠标手势实现随时随地录制
    GIF录制软件——Gif123Gif123-极简GIF录屏工具https://gif123.aardio.com/极简GIF录屏工具,可一键快速复制GIF图像并直接粘贴到其他程序。支持粘贴到本地文件、QQ、微信、Word、浏览器编辑器(支持公众号、头条编辑器)。可避免无法预览、无效图像、变静态图等常见的兼......
  • 基于Spring Boot+Vue的高校学科竞赛平台
    末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发更多项目:CSDN主页YAML墨韵学如逆水行舟,不进则退。学习如赶路,不能慢一步。目录一、项目简介二、开发技术与环境配置2.1SpringBoot框架2.2Java语言简介2.3Vue的介绍2.4mysql数据库介绍2.5B/S......
  • 基于Spring Boot+Vue的高校办公室行政事务管理系统
    末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发更多项目:CSDN主页YAML墨韵学如逆水行舟,不进则退。学习如赶路,不能慢一步。目录一、项目简介二、开发技术与环境配置2.1SpringBoot框架2.2Java语言简介2.3Vue的介绍2.4mysql数据库介绍2.5B/S......
  • [AIGC] 使用Spring Boot进行单元测试:一份指南
    在现代软件开发过程中,确认你的应用正确运行是至关重要的一步。SpringBoot提供了一组实用工具和注解来辅助你在测试你的应用时,使得这个过程变得简单。下面就来分享一下如何在SpringBoot中进行单元测试。文章目录为什么需要单元测试SpringBoot单元测试的基本步骤示......
  • Spring 中通过XML方式实现DI(依赖注入)
    1.IOC创建spring给我们提供了两种关于bean的方式:1.基于XML方式的Bean管理2.基于注解方式的Bean管理这里主要说一下基于XML方式的Bean管理【1】创建一个maven项目,在pom.xml里面并导入依赖<dependency><groupId>org.springframework</groupId>......
  • Python问题异常处理与日志结合
    我们掌握了try-except来处理程序运行中可能遇到的异常,以及使用logging来记录程序运行日志,该篇文章就结合二者来讲讲如何记录程序运行过程中的各种事件、状态信息以及遇到的异常情况,以便于追踪、诊断和解决程序运行时的问题。目录一、配置日志记录器 (logging.Logger)二、......
  • 【附源码】JAVA计算机毕业设计音乐豆瓣(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展,音乐作为人们日常生活中不可或缺的一部分,其获取与分享方式也在不断地变革。传统的音乐获取途径,如购买唱片或到实体音乐店挑选......
  • 注解总结,Java中的注解,springboot中的注解
    注解总结1、Junit开始执行的方法:初始化资源,执行完之后的方法:释放资源测试方法,必须是:公有、非静态、无参无返回值的在一个类中,可以定义多个测试方法,每个测试方法可以单独运行,也可以整体运行(顺序:方法名升序)Junit4注解说明@Test测试方法@Before用来修饰实例方法,在每个@......
  • (毕设)基于Java+SpringBoot+Vue+Mysql的智慧园区管理系统
        前言:智慧园区管理系统是一个集成了园区管理、缴费服务、退款功能、缴费提醒、抄表功能、打印功能、统计报表和协同办公等多个模块的综合性系统。以下是对每个模块及其子功能的简要说明:园区管理:园区管理:对整个园区进行宏观管理,包括园区的基本信息、资源配置、设施维......
  • 24.Spring Security OAuth2
    1.基本概念1.1.什么是认证进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,输入账号和密码登录微信的过程就是认证。系统为什么要认证?认......