SpringBoot统一接口返回及全局异常处理高级用法

下面我将为您详细讲解“SpringBoot统一接口返回及全局异常处理高级用法”的完整攻略。

1. 概述

在SpringBoot应用中,我们有时需要对接口的返回结果进行统一处理,并且需要对系统异常进行全局处理。为了达到这个目的,我们可以使用SpringBoot提供的@ControllerAdvice@ExceptionHandler注解来实现统一接口返回及全局异常处理的功能。

2. 统一接口返回

2.1 定义返回结果封装类

首先我们需要定义一个返回结果封装类,可以统一对接口的返回结果进行封装。

@Data
public class Result<T> {
    /**
     * 响应状态码
     */
    private int code;

    /**
     * 响应提示信息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    public Result(int code, String message) {
        this(code, message, null);
    }

    public Result(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
}

2.2 定义返回结果处理类

接下来,我们需要定义一个返回结果处理类,用来进行接口返回结果的统一封装。

@ControllerAdvice
public class ResultHandler {

    /**
     * 成功时返回的结果
     */
    private static final int SUCCESS_CODE = 200;

    /**
     * 失败时返回的结果
     */
    private static final int ERROR_CODE = 500;

    /**
     * 统一处理接口返回值
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Result<Object> handleException(Exception e) {
        e.printStackTrace();
        return new Result<>(ERROR_CODE, e.getMessage());
    }

    @ResponseBody
    @RequestMapping(produces = "application/json;charset=UTF-8")
    public Result<?> handleControllerException(HttpServletRequest request, Throwable ex) {
        if (ex instanceof BindException || ex instanceof MethodArgumentNotValidException) {
            return new Result<>(ErrorCode.REQUEST_PARAM_ERROR.getCode(), ex.getMessage());
        } else if (ex instanceof IllegalArgumentException) {
            return new Result<>(ErrorCode.REQUEST_PARAM_ERROR.getCode(), ex.getMessage());
        } else {
            ex.printStackTrace();
        }
        return new Result<>(ErrorCode.SERVER_ERROR.getCode(), ErrorMessage.INTERNAL_SERVER_ERROR);
    }

    /**
     * 成功时返回的结果
     *
     * @param data 返回的数据
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(SUCCESS_CODE, "成功", data);
    }

    /**
     * 失败时返回的结果
     *
     * @param message 提示信息
     */
    public static Result<?> error(String message) {
        return new Result<>(ERROR_CODE, message);
    }

    /**
     * 失败时返回的结果
     *
     * @param code    错误码
     * @param message 提示信息
     */
    public static Result<?> error(int code, String message) {
        return new Result<>(code, message);
    }
}

2.3 使用返回结果处理类

使用返回结果处理类的方法非常简单,只需要在控制器中进行调用即可。

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 查询所有用户
     */
    @GetMapping("/list")
    public Result<List<User>> getUsers() {
        List<User> userList = userService.getAllUsers();
        return ResultHandler.success(userList);
    }
}

3. 全局异常处理

3.1 定义异常处理类

接下来我们需要定义一个全局异常处理类,用来统一处理系统异常。

@ControllerAdvice
public class ExceptionHandler {

    /**
     * 处理自定义异常
     */
    @ResponseBody
    @ExceptionHandler(BusinessException.class)
    public Result<String> handleBusinessException(BusinessException e) {
        return new Result<>(e.getCode(), e.getMessage());
    }

    /**
     * 处理其他异常
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Result<String> handleException(Exception e) {
        e.printStackTrace();
        return new Result<>(500, "系统错误,请稍后重试");
    }
}

3.2 定义业务异常类

我们需要定义一个自定义业务异常类,用来统一处理业务异常。

public class BusinessException extends RuntimeException {

    /**
     * 错误码
     */
    private int code;

    /**
     * 错误提示信息
     */
    private String message;

    public BusinessException(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

3.3 使用全局异常处理

使用全局异常处理的方法非常简单,只需要在代码中抛出异常即可。

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 查询所有用户
     */
    @GetMapping("/list")
    public Result<List<User>> getUsers() {
        List<User> userList = userService.getAllUsers();
        return ResultHandler.success(userList);
    }

    /**
     * 根据用户ID查询用户
     */
    @GetMapping("/{userId}")
    public Result<User> getUserById(@PathVariable("userId") Integer userId) {
        User user = userService.getUserById(userId);
        if (user == null) {
            throw new BusinessException(ErrorCode.USER_NOT_FOUND.getCode(), "用户不存在");
        }
        return ResultHandler.success(user);
    }
}

以上就是“SpringBoot统一接口返回及全局异常处理高级用法”的完整攻略。如果您有更多问题,欢迎在评论区向我提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot统一接口返回及全局异常处理高级用法 - Python技术站

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

相关文章

  • Spring cloud config 配置文件加密方式

    首先需要说明的是,Spring Cloud Config 支持多种加密方式。这里我们将介绍两种比较常用的加密方式:对称加密和非对称加密。 对称加密方式 对称加密方式是一种加密方式,即使用同一个密钥进行加密和解密。Spring Cloud Config 支持对称加密方式,只需要在配置文件中指定相应的算法和密钥即可。 配置参数 在使用对称加密方式时,需要在配置文…

    Java 2023年5月20日
    00
  • 品味布隆过滤器的设计之美

    布隆过滤器是一个精巧而且经典的数据结构。 你可能没想到: RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。来吧,我们一起品味布隆过滤器的设计之美。 1 缓存穿透 我们先来看一个商品服务查询详情的接口: public Prod…

    Java 2023年4月17日
    00
  • java实现电话本管理系统

    Java实现电话本管理系统 1. 简介 电话本管理系统是一款方便用户管理联系人信息的工具,可以添加、删除、修改和查看联系人信息。本文将会介绍使用Java来开发这样一款电话本管理系统的完整攻略。 2. 技术选择 编程语言:Java 开发环境:Eclipse 数据库:MySQL Web框架:Spring Boot 前端框架:Vue.js 项目构建工具:Maven…

    Java 2023年5月23日
    00
  • struts2实现多文件上传的示例代码

    下面是实现Struts2多文件上传的完整攻略,包括两个示例。 步骤1:配置web.xml 在web.xml中,配置Struts2的过滤器,以确保Struts2拦截所有请求。以下是示例代码: <filter> <filter-name>struts2</filter-name> <filter-class>org…

    Java 2023年5月20日
    00
  • Sprint Boot @ImportResource使用方法详解

    Spring Boot的@ImportResource注解 在Spring Boot中,@ImportResource注解用于导入XML配置文件。使用@ImportResource注解可以将XML配置文件中定义的bean注册到Spring应用程序上下文中。本文将详细介绍@ImportResource注解的作用和使用方法,并提供两个示例说明。 @ImportR…

    Java 2023年5月5日
    00
  • Java多线程产生死锁的必要条件

    Java多线程产生死锁的必要条件有四个,包括互斥、请求和保持、不可剥夺、环路等待。只有四个条件同时满足,才能导致多线程产生死锁。 互斥 互斥是指当一个线程占用了某个资源,其他的线程就不能再占用该资源。如果在同一时刻有多个线程争夺同一资源,只能有一个线程占用该资源。 请求和保持 请求和保持是指当一个线程保持了某个资源,但同时还需要请求其他资源时,它不会将原有的…

    Java 2023年5月19日
    00
  • JAVA中截取字符串substring用法详解

    关于“JAVA中截取字符串substring用法详解”这个话题,我可以提供以下攻略: 一、substring()函数基础用法 substring()是JAVA中一个经常使用的字符串函数,用于截取给定字符串中的一部分。它的基本用法如下: String str = "Hello, world!"; String result = str.su…

    Java 2023年5月26日
    00
  • 带你粗略了解Java数组的使用

    带你粗略了解Java数组的使用 什么是数组? 数组是一种存储数据的集合。它可以存储多个同类型的数据元素,并且这些元素按照一定顺序排列。Java数组是一种容器,可以存储固定大小的同类型元素。数组可以存储基本数据类型和对象,但必须是同一个类型。 声明和初始化数组 声明一个数组需要指定数据类型和数组名称。 //声明一个整型数组 int[] arr; 初始化数组需要…

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