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日

相关文章

  • 如何基于SpringBoot部署外部Tomcat过程解析

    准备工作 在开始部署外部Tomcat之前,我们需要先准备好以下几点: 安装好Java环境,并配置好环境变量; 下载并解压Tomcat,建议下载Tomcat 9.x 版本; 新建一个Spring Boot项目,并配置好pom.xml文件,引入所需的相关依赖。 配置外部Tomcat与Spring Boot项目的关联 接下来,我们要将Spring Boot项目部署…

    Java 2023年6月2日
    00
  • SpringMVC+MyBatis分页(最新)

    以下是关于“SpringMVC+MyBatis分页(最新)”的完整攻略,其中包含两个示例。 1. 前言 在Web应用程序中,分页是一种常见的需求。在SpringMVC和MyBatis中,可以使用PageHelper插件来实现分页。本攻略将详细讲解如何使用SpringMVC和MyBatis实现分页。 2. 添加PageHelper依赖 在使用PageHelpe…

    Java 2023年5月16日
    00
  • spring整合kaptcha验证码的实现

    以下是详细讲解“Spring整合Kaptcha验证码的实现”的完整攻略,包括相关代码示例和说明: 1. 概述 Kaptcha是一个开源的验证码生成工具,可以生成常见的验证码图片。Spring框架是目前广泛使用的Java Web开发框架。将Spring与Kaptcha整合可以快速实现验证码功能,提高网站的安全性。 2. 引入Kaptcha 首先需要引入Kapt…

    Java 2023年6月15日
    00
  • JDBC 数据库常用连接 链接字符串

    当我们使用Java来操作数据库时,需要使用到JDBC API。而在使用JDBC API时,我们需要对数据库进行连接,与数据库建立起联系,这个过程称为“连接(Connect)”。 连接包括几个关键步骤: 1.导入JDBC相关的Jar包 我们需要导入JDBC相关的Jar包才能够使用JDBC API。常用的Jar包有mysql-connector-java,它是M…

    Java 2023年6月16日
    00
  • 什么是Java Security Manager?

    Java SecurityManager是Java安全管理器,它是Java安全体系结构中的一部分,依靠安全策略来保护Java应用程序中的代码和资源。SecurityManager为你的代码提供了非常细粒度的安全控制,可以保证应用程序中的代码和资源的安全性,以防止恶意攻击、非法访问和其它的安全威胁。 使用Java SecurityManager的步骤如下: 启…

    Java 2023年5月11日
    00
  • SpringBoot 整合jdbc和mybatis的方法

    以下是SpringBoot整合jdbc和mybatis的方法的完整攻略: 前置要求 在进行SpringBoot整合jdbc和mybatis之前,需要确保已满足以下要求: 已安装好JDK,并配置好环境变量。 已安装好Maven。 已安装好MySQL,创建好了相应的数据库和表,并记录下来数据库的连接信息。 建立SpringBoot项目 首先,需要新建一个Spri…

    Java 2023年5月20日
    00
  • jQuery easyui刷新当前tabs的方法

    关于”jQuery easyui刷新当前tabs的方法”,我们可以使用tabs组件的refresh方法或者手动刷新方式来实现。下面分别进行说明: 使用refresh方法 确保你已经引入了jQuery和jQuery easyui的相关文件。 在需要刷新tabs的地方,获取当前选中的tabs选项卡的索引值。 var currentTabIndex = $(&qu…

    Java 2023年6月15日
    00
  • 从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC

    作者:京东科技 康志兴 Shenandoah Shenandoah一词来自于印第安语,十九世纪四十年代有一首著名的航海歌曲在水手中广为流传,讲述一位年轻富商爱上印第安酋长Shenandoah的女儿的故事。 后来美国有一条位于Virginia州西部的小河以此命名,所以Shenandoah的中文译名为“情人渡”。 Shenandoah首次出现在Open JDK1…

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