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

yizhihongxing

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

  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日

相关文章

  • SpringMVC框架整合Junit进行单元测试(案例详解)

    SpringMVC框架整合Junit进行单元测试(案例详解) 在 SpringMVC 中,我们可以使用 Junit 进行单元测试。本文将详细讲解 SpringMVC 框架整合 Junit 进行单元测试的完整攻略,包括如何配置 SpringMVC、如何使用 Junit 进行单元测试、如何编写测试用例等。 配置 SpringMVC 在使用 Junit 进行单元测…

    Java 2023年5月18日
    00
  • SpringBoot应用监控带邮件警报的实现示例

    SpringBoot应用监控带邮件警报是一种常用的应用监控方案,可以在应用发生异常情况时,自动发送邮件提醒开发人员进行处理。下面我将给出一个完整的攻略,包含以下几个步骤: 添加依赖 在SpringBoot项目的pom.xml文件中添加对Spring Boot Actuator和Spring Boot Mail的依赖,以实现监控和发送邮件功能。 <dep…

    Java 2023年5月20日
    00
  • jsp网页实现贪吃蛇小游戏

    关于JSP网页实现贪吃蛇小游戏,我们可以分为以下几个步骤: 1. 设计页面 首先,我们要设计一个页面来展示贪吃蛇游戏。可以在页面中设置游戏区域、得分区域等。可以使用HTML和CSS来完成这个页面的设计。 以下是一个简单的示例代码: <!DOCTYPE html> <html> <head> <meta charset…

    Java 2023年6月15日
    00
  • Java之JFrame输出Helloworld实例

    Java中,JFrame是一种可用于创建窗口的GUI (图形用户界面) 组件。要创建JFrame输出hello world实例,需要按照以下步骤进行操作: 导入相关库 首先,需要导入javax.swing包,因为它包含用于创建JFrame窗口的类。 import javax.swing.JFrame; 创建一个新的JFrame对象并设置标题 利用JFrame…

    Java 2023年5月24日
    00
  • SpringMVC通过RESTful结构实现页面数据交互

    SpringMVC通过RESTful结构实现页面数据交互 在Web应用程序中,页面数据交互是非常重要的。SpringMVC通过RESTful结构可以实现页面数据交互,本文将详细介绍如何使用SpringMVC通过RESTful结构实现页面数据交互,并提供两个示例说明。 RESTful结构 RESTful是一种Web应用程序的架构风格,它使用HTTP协议进行通信…

    Java 2023年5月17日
    00
  • SpringMVC参数的传递之如何接收List数组类型的数据

    当用户在前端页面通过表单提交数据时,SpringMVC框架负责将数据传递给后端控制器,以便进行相关的业务处理。这些数据通常是参数,可以是基本数据类型、实体类、List数组等。本文将重点介绍如何在SpringMVC控制器中接收List数组类型的数据。 接收List数组类型参数的配置 SpringMVC的数据绑定机制非常灵活,可以通过使用@RequestPara…

    Java 2023年5月26日
    00
  • 基于Maven骨架创建JavaWeb项目过程解析

    下面我将详细讲解基于Maven骨架创建JavaWeb项目的过程解析: 1. 了解Maven项目结构 在使用Maven骨架创建JavaWeb项目之前,我们先要了解一下Maven项目结构,这样才能更好地使用Maven工具进行开发。Maven项目结构一般包括以下目录: |– pom.xml |– src |– main |– java |– com.ex…

    Java 2023年5月20日
    00
  • 实例详解angularjs和ajax的结合使用

    当我们在开发前端网站时,经常需要使用异步请求获取数据来更新网站的内容。同时,随着前端框架的不断发展,AngularJS成为了一款非常流行的前端框架之一。本文将深入探讨AngularJS和AJAX的结合使用,为读者提供使用AngularJS和AJAX来实现异步请求的具体方案。 AngularJS和AJAX AngularJS是由Google开发的一款前端MVC…

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