Spring Boot 如何自定义返回错误码错误信息

一、背景知识

在开发过程中,定义一套统一的错误码以及错误信息对于后续的使用和协作有很大的帮助,这笔帮助在项目人员的交流、定位问题、维护代码等方面会发挥至关重要的作用。

Spring Boot 是一个优秀的开源框架,同样也提供了很多途径来自定义错误码以及错误信息,因此本文打算讲解一下如何在 Spring Boot 中自定义返回错误码和错误消息的过程。

二、应用场景

对于一个后端 RESTful API 的服务来说,我们可以在以下情况中使用自定义错误码和错误消息的功能:

  1. API请求的参数不合法,返回错误原因和错误码;

  2. 在业务逻辑处理过程中产生了异常,返回异常信息和异常码;

  3. 用户进行的操作需要特定的权限,请求未能通过权限检查,返回 403 错误码和错误信息。

以上情况只是示例,具体应用场景可能更加丰富和复杂,但是通过这些场景就可以简单而清晰地理解为什么需要自定义错误码和错误信息。

三、实现过程

在 Spring Boot 中实现自定义错误码和错误信息需要对以下两个类进行处理:

  1. 自定义异常类 ErrorInfoException ;

  2. 异常处理类 CustomExceptionHandler 。

下面,针对以上两个类分别进行详细的讲解。

3.1 自定义异常类 ErrorInfoException

为了方便返回错误码和错误信息,我们需要构造一个自定义的异常类 ErrorInfoException 。以下是一个示例代码:

public class ErrorInfoException extends RuntimeException {

    private static final long serialVersionUID = 1L;
    private ErrorCode errorCode;

    public ErrorInfoException(ErrorCode errorCode) {
        this.errorCode = errorCode;
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }
}

在代码中,我们定义了一个 ErrorCode 类型的参数 errorCode ,用于表示错误码,以及一个 getErrorCode() 方法用于获取错误码的值。

同时我们继承了 RuntimeException,因为该类是非受检异常,这将使我们可以在任何时候抛出该异常。

注意,这里我们以枚举类型的方式定义了错误码以及错误信息,在这个枚举中,我们可以自行定义应用的一些字符串常量。

以下是代码示例:

public enum ErrorCode {
    MISSING_REQUEST_PARAM_ERROR(10000, "缺少请求参数"),
    UNAUTHORIZED_ERROR(10001, "未授权错误"),
    ACCOUNT_LOCKED_ERROR(10002, "账号被锁定"),
    INVALID_REQUEST_PARAMETER_ERROR(10003, "请求参数无效"),
    BAD_REQUEST_ERROR(10004, "无效的请求"),
    THIRD_PARTY_API_FAILED(10005, "第三方api失败"),
    ...

    private int code;
    private String message;

    private ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

以上是定义 ErrorCode 类型的枚举,枚举成员都是错误码,每个成员有一个 code 值和一个 message 值。

3.2 异常处理类 CustomExceptionHandler

为了统一处理自定义错误码和错误信息的获取和返回,我们需要一个异常处理类 CustomExceptionHandler 来处理控制器中抛出的 ErrorInfoException,并将错误码包装响应的 HttpResponse 中。以下是一个示例代码:

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);

    @ExceptionHandler(ErrorInfoException.class)
    @ResponseBody
    ResponseEntity<ErrorResponse> handleControllerException(HttpServletRequest request, Throwable ex) {
        logger.info("发生了异常!原因是:{},{}", ex.getMessage(), ex.getCause());
        ErrorInfoException errorInfoException = (ErrorInfoException)ex;
        ErrorCode errorCode = errorInfoException.getErrorCode();
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setErrorCode(errorCode.getCode());
        errorResponse.setErrorMessage(errorCode.getMessage());

        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    ResponseEntity<ErrorResponse> handleControllerException(HttpServletRequest request, Exception ex) {
        logger.info("发生了异常!原因是:{},{}", ex.getMessage(), ex.getCause());
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setErrorCode(500);
        errorResponse.setErrorMessage("服务器内部错误");

        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在代码中,我们定义了一个异常处理类 CustomExceptionHandler 用于捕获用户自定义的异常 ErrorInfoException,并将信息包装成我们自定义的 ErrorResponse 响应对象。

在 handleControllerException 方法中,我们先判断异常类型,如果是 ErrorInfoException 类型,则从异常中获取错误码 errorCode , 调用它的 getCode() 方法和 getMessage() 方法来得到异常信息,然后将它们赋给响应对象 ErrorResponse 并返回。

如果是其他类型异常,则返回服务器内部错误代码 500 和错误信息 “服务器内部错误”。

注意,我们使用了 @ControllerAdvice 注解来指定当前类为全局异常处理类,从而捕获任意控制器中可能出现的异常。

四、示例:使用自定义返回错误码和错误信息的功能

接下来,我们为上述实现过程提供两个简单的示例,以说明如何在 Spring Boot 中使用自定义错误码和错误信息的功能。

4.1 示例 1:API请求的参数不合法,返回错误原因和错误码

在我们的请求参数缺失或无效时,我们可以使用自定义错误码来解决这个问题。以下是示例代码:

@RequestMapping(value="/user", method = RequestMethod.POST)
public ResponseEntity<User> createUser(@RequestBody User user) {
    if(user.getUsername() == null) {
        throw new ErrorInfoException(ErrorCode.INVALID_REQUEST_PARAMETER_ERROR);
    }
    ...
}

在代码中,我们使用了自定义异常类 ErrorInfoException , 并使用枚举 INVALID_REQUEST_PARAMETER_ERROR 作为异常的错误码,来表示请求参数无效的错误。

如果发生该异常,则会对该异常进行捕获并给出错误码和错误信息。

4.2 示例 2:在业务逻辑处理过程中产生了异常,返回异常信息和异常码

在我们的业务逻辑处理过程中发生异常时,我们同样需要使用自定义错误码来解决这个问题。以下是示例代码:

public ResponseEntity<String> execute() {
    try {
        ...
    } catch (Exception ex) {
        throw new ErrorInfoException(ErrorCode.THIRD_PARTY_API_FAILED);
    }
}

在代码中,我们在执行业务逻辑时,如果发生异常将抛出 ErrorInfoException 异常,并使用枚举 THRID_PARTY_API_FAILED 作为异常的错误码,来表示第三方 api 调用失败。

如果发生该异常,则会对该异常进行捕获并给出错误码和错误信息。

五、总结

本文详细讲解了如何在 Spring Boot 中自定义返回错误码和错误信息的过程,包括自定义异常类 ErrorInfoException 和 异常处理类 CustomExceptionHandler,最后通过两个实例来说明它的应用场景以及它的优点特色。

在项目开发过程中,我们应该清晰地把握每一个细节,并结合实际应用需求进行改进和开发,以实现优秀的工业应用。

谢谢大家!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 如何自定义返回错误码错误信息 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 深入JAVA对象深度克隆的详解

    深入JAVA对象深度克隆的详解 对象深度克隆是指克隆一个对象及其子对象,同时新对象与原对象是互不干扰的,对新对象的任何修改都不会影响原对象。在Java中,实现对象深克隆通常使用“序列化”和“反序列化”技术。本篇文章将详细讲解如何实现Java对象的深度克隆。 实现Java对象深度克隆 方法一:序列化与反序列化实现克隆 序列化对象可以用ObjectOutputS…

    Java 2023年5月26日
    00
  • 微信小程序上传文件到阿里OSS教程

    下面是详细的“微信小程序上传文件到阿里OSS教程”,包含以下步骤: 1. 注册阿里云账号 如果还没有阿里云的账号,需要先注册一个账号,注册地址:https://account.aliyun.com/register/register.htm 2. 创建 OSS Bucket 登录阿里云控制台,进入对象存储 OSS 控制台,创建自己需要的 Bucket。具体操…

    Java 2023年5月23日
    00
  • Android实现IOS相机滑动控件

    下面我会详细讲解在Android平台上实现类似IOS相机滑动控件的完整攻略。实现该控件需要涉及到自定义控件的开发和手势识别等技能。 一、基本原理 自定义滑动控件:为了实现类似IOS相机的滑动效果,需要将Android的默认控件ScrollView转换为自定义控件,在该自定义控件中重写touch事件以及scroll事件,实现手势识别和滑动效果。 手势识别:在自…

    Java 2023年5月26日
    00
  • 通过Java代码来创建view的方法

    创建View对象是Android开发很常用的操作,通常情况下我们使用xml文件来创建View对象。但是在某些情况下,可能需要使用Java代码来创建View对象。这个时候就需要学会通过Java代码来创建view的方法了。 一、创建View的步骤 第一步:导入需要的类库 在创建View对象之前,需要导入需要使用的类库。 import android.conten…

    Java 2023年5月23日
    00
  • 手工搭建Servlet实现

    手工搭建Servlet实现的完整攻略如下: 1. 环境准备 首先,我们需要准备好开发所需要的环境: JDK:Java 开发包,需要安装在计算机上 Eclipse:一个常用的 Java IDE 开发工具,可以用来编写和运行 Java 代码 Tomcat:Java Web 应用服务器,用来运行 Servlet 应用 安装和配置 JDK 和 Eclipse 并不在…

    Java 2023年5月19日
    00
  • Java编程思想对象的容纳实例详解

    Java编程思想对象的容纳实例详解 在Java编程中,对象的容纳是一个非常重要的概念。在本文中,我们将详细介绍Java中对象的容纳,包括容纳的数据类型和常用的容纳实例方法。 容纳的数据类型 Java中可以容纳的数据类型非常多,比如基本数据类型(byte、short、int、long、float、double、char、boolean)、数组、对象、接口等等。…

    Java 2023年5月26日
    00
  • Tomcat 9 免安装版配置的图文教程(详)

    下面我将为您详细讲解“Tomcat 9 免安装版配置的图文教程(详)”的完整攻略。 一、前言 在本攻略中,我将为您介绍如何配置Tomcat 9免安装版,以便在Windows电脑上搭建Java Web开发环境。Tomcat是一种非常流行的Java应用服务器,由Apache提供支持,并且具有良好的性能和稳定性。本攻略中的操作步骤适用于Windows 7、Wind…

    Java 2023年5月19日
    00
  • SpringBoot浅析安全管理之基于数据库认证

    SpringBoot浅析安全管理之基于数据库认证 在SpringBoot中,我们可以使用Spring Security来实现安全管理。本文将以基于数据库认证的方式为例,讲解SpringBoot安全管理的实现过程。 基础知识 在使用Spring Security进行安全管理之前,我们需要掌握以下一些基础知识: Spring Security的基本概念(如认证、…

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部