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

yizhihongxing

一、背景知识

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

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日

相关文章

  • Spring Data JPA 映射VO/DTO对象方式

    Spring Data JPA是Spring Framework中一个非常流行的模块,它提供了一种基于JPA的数据访问方式,简化了数据库访问的编码量。在实际应用中,我们通常需要将JPA实体类映射为业务层的DTO或者VO对象,本文将为大家详细介绍Spring Data JPA映射VO/DTO对象的完整攻略,包括以下几个方面: 为什么需要VO/DTO对象? 在实…

    Java 2023年6月3日
    00
  • 关于maven打包出错的解决方案

    下面是讲解“关于maven打包出错的解决方案”的完整攻略。 问题描述 在使用 Maven 打包过程中,有时会出现打包失败的情况,比如无法找到依赖库、编译错误等等,这给开发者带来困扰,下面将介绍几种解决方案。 解决方案 方案一:清理本地仓库 执行以下命令清理本地 Maven 仓库中的缓存以及无用依赖,重新下载所需的依赖。 mvn clean 方案二:检查依赖参…

    Java 2023年5月19日
    00
  • 微信小程序下拉刷新界面的实现

    以下是关于微信小程序下拉刷新界面实现的完整攻略,包括两条实例说明。 一、基本概念 在介绍如何实现下拉刷新之前,需要了解一些基本概念: scroll-view组件:滚动视图,用于滚动展示长列表或区域。在小程序中,可以使用scroll-view组件实现下拉刷新。 下拉刷新函数:在scroll-view组件的bindscrolltolower属性中绑定一个触发事件…

    Java 2023年5月23日
    00
  • Java concurrency之LockSupport_动力节点Java学院整理

    Java concurrency之LockSupport 什么是LockSupport LockSupport是Java并发包中的一个类,用于创建锁和其他同步类的基本构建块,它与已有的同步类不同,其可以阻塞和唤醒线程。LockSupport提供了非常灵活的线程阻塞和唤醒操作,其不会遇到像Object.wait和Thread.join方法那样的一些限制,如同程…

    Java 2023年5月19日
    00
  • java中对象调用成员变量与成员实例方法

    Java 中,对象调用成员变量和成员实例方法的过程是通过对象的引用来实现的。下面是完整的攻略: 对象调用成员变量 首先需要创建一个对象的实例,即对象的地址,然后通过对象的引用来调用成员变量。Java 中的成员变量可以分为类变量和实例变量。对于类变量,直接使用类名来调用即可。对于实例变量,则必须使用对象的引用来调用。 调用类变量 调用类变量可以直接使用类名,例…

    Java 2023年5月26日
    00
  • Java运算符的知识点与代码汇总

    Java运算符的知识点与代码汇总 1. 概述 Java运算符是Java语言中用于完成各种算数、关系和逻辑运算的符号。在Java程序中,运算符经常被用于各种运算表达式中,通过运算符可以组合复杂的逻辑表达式,完成各种数据计算和判断。本文将详细讲解Java运算符的知识点和一些常见的使用示例。 2. 分类 Java运算符可分为以下几类: 算术运算符 赋值运算符 自增…

    Java 2023年5月30日
    00
  • Java @Autowired报错原因分析和4种解决方案

    下面是“Java @Autowired报错原因分析和4种解决方案”的完整攻略。 问题描述 在使用Spring框架进行Java开发时,有时候会使用到注解方式自动装配依赖。其中,@Autowired是最为常见的一种方式。但是,在使用@Autowired进行自动装配时,有时候会出现报错的情况。那么,造成报错的原因是什么呢?我们该如何解决这个问题呢? 原因分析 无法…

    Java 2023年5月25日
    00
  • 关于Android高德地图的简单开发实例代码(DEMO)

    如果您正在开发Android应用程序,并想在应用程序中添加地图功能,您可以使用高德地图API。该API可用于许多用例,包括地图摆放,检索地理编码和反地理编码,计算路线和在地图上绘制自定义图形等。 下面是关于Android高德地图的简单开发实例代码(DEMO)的完整攻略: 第一步:注册高德开发者账号 在使用高德地图API之前,您需要注册一个高德开发者账号。注册…

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