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日

相关文章

  • 详解Spring Security中权限注解的使用

    下面为你详细讲解“详解Spring Security中权限注解的使用”的攻略。 1. Spring Security中权限注解的概述 Spring Security中的权限注解可以轻松的控制方法或者类的访问权限,对于企业级应用开发中,权限的控制至关重要,因为这不仅是对数据安全的一种保障,同时也是提高整个应用的稳定性和可靠性的重要方式。 在Spring Sec…

    Java 2023年5月20日
    00
  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    Spring Boot整合MyBatis的超详细过程 MyBatis是一种优秀的持久层框架,可以帮助我们更好地管理数据库。在Spring Boot应用程序中,我们可以使用MyBatis来访问数据库。本文将详细讲解如何在Spring Boot应用程序中整合MyBatis,包括配置模式和注解模式。 步骤一:添加依赖 我们需要在pom.xml文件中添加以下依赖项:…

    Java 2023年5月15日
    00
  • maven如何使用slf4j输出日志到文件

    使用 Maven 来构建项目时,常常需要对项目的运行状态进行日志记录,方便项目的调试和交付。SLF4J 是一个 Java 日志框架,具有轻量级、可扩展的特点,同时提供了多种日志实现的接口,便于灵活选择。本文将介绍如何使用 SLF4J 日志框架,在项目中输出日志到文件。 1. 引入依赖 首先,需要在项目中引入 SLF4J 的依赖。在工程的 pom.xml 文件…

    Java 2023年5月19日
    00
  • Spring Boot学习入门之统一异常处理详解

    Spring Boot学习入门之统一异常处理详解 一、简介 在开发Web应用程序时,不可避免地会遇到各种异常情况。如果没有良好的异常处理机制,系统就很难保证稳定性和安全性。Spring Boot提供了很好的异常处理能力,通过统一异常处理机制可以对出现的异常进行捕获,避免异常导致程序崩溃。 二、异常处理流程 Spring Boot中的异常处理流程如下所示: 当…

    Java 2023年5月27日
    00
  • SpringData @Query和@Modifying注解原理解析

    当使用Spring Data JPA进行数据库操作时,我们可能需要对一些自定义查询进行优化。Spring Data提供了@Query和@Modifying注解来支持这种自定义查询操作。 @Query注解 @Query注解可以被使用在repository接口的方法上,它可以用于定义一个自定义的查询语句。 Spring Data JPA将@Query注解和方法的…

    Java 2023年5月20日
    00
  • 使用maven插件对java工程进行打包过程解析

    使用 Maven 插件可以非常方便地对 Java 工程进行打包。下面是使用 maven-assembly-plugin 对 Java 工程进行打包的攻略: 1. 添加 Maven 插件 在 pom.xml 文件中添加 maven-assembly-plugin 插件的依赖: <build> <plugins> <plugin&g…

    Java 2023年5月20日
    00
  • 浅谈java日志格式化

    浅谈Java日志格式化 什么是日志格式化 在进行Java应用开发的过程中,日志系统是必不可少的一个组件。日志格式化就是在记录应用程序运行中产生的日志信息时,对不同的信息类型进行分类、分级,并为每一条日志信息提供一个易于读取和理解的格式,以方便后续的调试、运维和分析工作。 日志格式化的重要性 在一个应用程序中,日志系统是一个非常重要的组件。通过日志系统,可以帮…

    Java 2023年5月26日
    00
  • 在JSP中处理虚拟路径

    如何在JSP中处理虚拟路径 在JSP中处理虚拟路径需要使用到JSP内置对象中的application对象、pageContext对象和HttpServletRequest对象。通过这些内置对象中提供的方法来获取虚拟路径的实际路径,并将其与页面的文件路径拼接在一起。 具体实现过程如下: 1.获取虚拟路径的实际路径 在JSP页面中获取虚拟路径的实际路径可以通过以…

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