Spring Boot统一接口返回及全局异常处理

针对这个问题,我需要从以下几个方面来进行讲解:

  1. Spring Boot统一接口返回
  2. 全局异常处理

Spring Boot统一接口返回

在Spring Boot开发中,我们通常需要采用统一的接口返回格式,以便于前后端进行沟通和交互,同时对于异常情况也需要进行统一处理。

在实现统一接口返回的过程中,我们可以借助Spring Boot提供的ResponseBodyAdvice接口来完成。该接口可以用于对Controller层的返回值进行处理,并将其统一返回给前端。

具体实现方式如下:

  1. 创建一个返回类
public class Result<T> {
    // 状态码
    private Integer code;
    // 状态码对应的提示信息
    private String message;
    // 返回的数据
    private T data;

    // 生成getter和setter方法
}
  1. 创建一个ResponseBodyAdvice类
@ControllerAdvice(basePackages = "com.xxx.controller")
public class ResultBodyAdvice implements ResponseBodyAdvice<Object> {

    /**
     * 是否支持advice功能
     * @param methodParameter
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 处理response的具体方法
     * @param o
     * @param methodParameter
     * @param mediaType
     * @param aClass
     * @param serverHttpRequest
     * @param serverHttpResponse
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {

        if(o instanceof Result){
            return o;
        }

        Result<Object> result = new Result<>();
        result.setCode(HttpStatus.OK.value());
        result.setMessage(HttpStatus.OK.getReasonPhrase());
        result.setData(o);

        return result;
    }

}
  1. 在controller中返回结果
@RestController
public class UserController {

    @GetMapping("/getuser")
    public User getUser(){
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        return user;
    }

}

经过测试,可以看到返回结果已经被统一处理成了Result的格式:

{
    "code":200,
    "message":"OK",
    "data":{
        "name":"张三",
        "age":20
    }
}

全局异常处理

在Spring Boot开发中,如果不进行统一的异常处理,当出现异常情况时系统会直接返回异常信息,这样会使得接口的返回格式非常混乱,同时也不利于对异常情况的统一处理。

因此,我们需要对异常情况进行全局处理,可以采用Spring Boot提供的@ControllerAdvice注解配合@ExceptionHandler注解来完成,具体实现方式如下:

  1. 创建一个异常类
@AllArgsConstructor
@Getter
public class ErrorResponse {
    // 状态码
    private final Integer code;
    // 错误信息
    private final String message;
}
  1. 创建一个全局异常处理类
@ControllerAdvice(basePackages = "com.xxx.controller")
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ErrorResponse handleException(Exception e) {
        if (e instanceof CustomException) {
            CustomException customException = (CustomException) e;
            return new ErrorResponse(customException.getCode(), customException.getMessage());
        } else if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e;
            BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
            ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
            return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), objectError.getDefaultMessage());
        } else if (e instanceof HttpMessageNotReadableException) {
            return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不正确");
        }
        return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器内部错误");
    }
}
  1. 在controller中制造异常
@RestController
public class UserController {

    @GetMapping("/exception")
    public void getException(){
        throw new CustomException(HttpStatus.BAD_REQUEST.value(),"用户请求参数不正确");
    }

}

经过测试,当访问Exception接口时会直接返回异常信息:

{
    "code":400,
    "message":"用户请求参数不正确"
}

当然,在我们的实际开发中,会遇到各种不同的异常情况,因此在全局异常处理的过程中,还需要根据实际情况进行针对性的异常处理。

上面的两个例子只是非常简单的示例,仅仅是展示了如何实现统一接口返回和全局异常处理。在我们的实际开发中一定要结合实际情况进行具体调整和优化。

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

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

相关文章

  • Failed to execute goal org…的解决办法

    针对“Failed to execute goal org…的解决办法”的问题,我为你提供完整的攻略,以下为具体步骤: 问题背景 当使用mvn命令构建Maven项目时,可能会遇到以下错误信息: Failed to execute goal org… 该错误信息一般会提示缺失相关的依赖或者插件,导致项目构建失败。 解决方案 针对该问题,可以按照以下步骤…

    Java 2023年5月20日
    00
  • 一篇文章带你了解Java SpringBoot Nacos

    一篇文章带你详解Java SpringBoot Nacos 什么是SpringBoot? SpringBoot是一个基于Spring框架的快速开发框架,它简化了Spring的配置、发布和部署过程,提高了开发效率。同时SpringBoot也集成了大量常用的库和插件,方便开发人员开箱即用。如果您是Java开发者,使用SpringBoot无疑是提高开发效率的好选择…

    Java 2023年5月20日
    00
  • SpringBoot validator参数验证restful自定义错误码响应方式

    下面我将详细讲解“SpringBoot validator参数验证restful自定义错误码响应方式”的完整攻略。 一、背景介绍 在SpringBoot应用中经常需要对API的请求参数进行验证,如果请求参数不符合要求,需及时响应错误信息告知请求方。SpringBoot提供了Validator机制来方便地进行参数验证,在参数验证不通过时会抛出BindingRe…

    Java 2023年6月1日
    00
  • java连接mysql数据库的方法

    针对”java连接mysql数据库的方法”,我可以提供以下完整攻略: 1. 导入mysql的驱动包 在使用Java进行连接MySQL数据库之前,我们首先需要导入mysql的驱动包。可以从MySQL官方网站下载最新的版本并解压,或者去Maven仓库搜索下载最新版本。 假设我们将下载的驱动包保存在项目根目录下的lib文件夹中,那么就需要在项目的pom.xml中添…

    Java 2023年5月19日
    00
  • Java中过滤器 (Filter) 和 拦截器 (Interceptor)的使用

    Java中的过滤器(Filter)和拦截器(Interceptor)是Web开发中常用的两个概念,它们能够有效地对请求进行处理和控制。在本文中,我们将针对Java中过滤器和拦截器的使用进行详细讲解,包括二者的区别、使用方法、作用范围等内容,并举例说明。 一、过滤器(Filter)和拦截器(Interceptor)的区别 过滤器(Filter)和拦截器(Int…

    Java 2023年5月26日
    00
  • Java中的日期时间处理及格式化处理

    Java中的日期时间处理及格式化处理 Java中完整的日期时间处理需要使用到Java.util包和Java.text包的类。日期时间处理主要包括以下内容: 1. Date类 Java中的Date类表示日期和时间的类。它表示的是一个具体的时间点,精度为毫秒级别。常用的方法有: //获取当前时间 Date today = new Date(); //获取时间戳 …

    Java 2023年5月20日
    00
  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

    首先我们需要了解一下如何在ASP.NET中使用jQuery和AJAX。在ASP.NET中,我们可以使用JavaScriptSerializer对象将对象序列化为JSON格式,然后将其返回给客户端。 以下是实现无刷新分页的详细流程和实例代码: 第一步:添加必要的JavaScript库 我们需要在网站中添加jQuery和Ajax的库文件。可以手动下载这些库文件并…

    Java 2023年5月19日
    00
  • 手把手教你写Maven的archetype项目脚手架

    我来为你详细讲解“手把手教你写Maven的archetype项目脚手架”的完整攻略。 什么是Maven的archetype? Maven的archetype是一种脚手架工具,它可以帮助我们快速创建符合规范的Maven项目结构,包含必要的文件和依赖,以满足特定的需求。通常来说,一个archetype文件包含了一个或多个模板(template),这些模板用来生成…

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