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实现评论回复功能的完整步骤: 1. 数据库设计 首先需要为评论和回复设计数据库表,常见的设计方式是使用两个表分别存储评论和回复,这两个表之间可以通过外键联系起来。一个简单的示例表结构如下: 评论表 Field Type Description id int 评论ID content varchar 评论内容 parent_id int 父评论I…

    Java 2023年5月19日
    00
  • 安全管理器的作用是什么?

    安全管理器是一种可以用来管理Java应用程序中的安全策略的类,它可以控制应用程序访问受限资源的权限。在Java应用程序中,安全管理器主要用于保护操作系统的安全和避免恶意代码的攻击。 安全管理器主要有以下作用: 对于受保护的代码块进行管理和控制 安全管理器可以用来管理和控制Java应用程序中的受保护的代码块或敏感操作,例如文件读写操作、网络访问和反射调用。如果…

    Java 2023年5月11日
    00
  • 几道和「黑洞照片」那种海量数据有关的算法问题

    这个话题涉及到海量数据处理和算法问题,我会尽可能详细地解释来帮助大家了解。 大数据处理的常用算法 排序算法 排序是大数据处理中最常用的算法之一。这是因为,在许多情况下,我们需要对从数据库中获取的大量数据进行排序,以便更好地分析和使用它们。以下是一些常用的排序算法: 冒泡排序:这是一种简单的排序算法,在较小的数据集中表现良好,但对于大规模数据集则效率较低。 快…

    Java 2023年5月19日
    00
  • Java创建和启动线程的两种方式实例分析

    Java创建和启动线程的两种方式实例分析 在 Java 中,线程是并发编程的核心概念之一。线程的创建和启动是任何并发应用的首要任务之一。Java 提供了两种方式来创建和启动线程,分别是继承 Thread 类和实现 Runnable 接口。 继承 Thread 类 继承 Thread 类是最常用的创建线程的方式,实现比较简单。我们需要继承 Thread 类,重…

    Java 2023年5月19日
    00
  • JavaWeb文件上传入门教程

    下面我为你详细讲解JavaWeb文件上传的完整攻略。 一、前置知识 在进行文件上传操作之前,我们需要先掌握以下知识: HTML表单的基本使用方法; HTTP协议中的multipart/form-data; Servlet与JSP的基本使用方法; Java IO流的基本使用方法。 二、文件上传的流程 文件上传一般分为以下几个步骤: 在前端HTML页面中设置文件…

    Java 2023年6月15日
    00
  • jQuery Ajax传值到Servlet出现乱码问题的解决方法

    下面是详细的攻略: 问题背景 在使用 jQuery Ajax 技术将数据传递到 Servlet 后台时,有时会遇到中文乱码的问题,这是因为在传输过程中,字符编码格式不统一,导致原本正确的中文字符被解析成乱码的字符。 解决方法 为了解决这个问题,我们需要对字符编码格式进行统一,可以通过以下两种方法实现。 解决方法一:手动设置字符编码格式 在 jQuery Aj…

    Java 2023年6月15日
    00
  • 详解使用Spring Security OAuth 实现OAuth 2.0 授权

    详解使用Spring Security OAuth 实现OAuth 2.0 授权 什么是OAuth 2.0? OAuth 2.0是用于授权的标准协议,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或者将所有的数据转移到第三方应用。 Spring Security OAuth2 Spring Securit…

    Java 2023年5月20日
    00
  • java获取json中的全部键值对实例

    下面是Java获取JSON中的全部键值对的攻略: 步骤一:导入相关包 获取JSON中的全部键值对需要用到Java中的相关包,需要在代码中进行导入,示例代码如下: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.util.Iterator…

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