spring boot 统一JSON格式的接口返回结果的实现

下面我来详细讲解一下“Spring Boot 统一 JSON 格式的接口返回结果的实现”攻略。

1. 前言

在实际的项目中,我们往往需要为每个接口编写返回数据的格式,这样很浪费时间。而使用统一的 JSON 返回格式,不仅可以减少代码量,还能让前端开发更加便捷。本文将明确探讨在 Spring Boot 中如何实现这一目标。

2. 统一 JSON 格式的接口返回结果的实现

我们可以通过使用 Spring Boot 提供的拦截器、自定义注解、统一异常处理等来实现统一 JSON 格式的接口返回结果。下面分别介绍这三种方式的实现方法。

2.1 使用拦截器

我们可以通过编写拦截器,在接口调用完毕后修改返回的 JSON 格式。具体实现步骤如下:

  1. 创建一个拦截器类,实现 HandlerInterceptor 接口,并在 afterCompletion 方法中对返回结果进行处理,将其封装成统一 JSON 格式。

```java
@Component
public class ResponseHandlerInterceptor implements HandlerInterceptor {

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                               Exception ex) throws Exception {
       if (ex != null) {
           // 异常不处理
           return;
       }
       if (handler instanceof HandlerMethod) {
           HandlerMethod handlerMethod = (HandlerMethod) handler;
           // 获取方法上的注解
           ApiResult apiResult = handlerMethod.getMethod().getAnnotation(ApiResult.class);

           if (apiResult != null) {
               // 获取返回值的类型
               Class<?> returnType = handlerMethod.getReturnType().getParameterType();
               // 判断是否是统一返回格式要求的类型
               if (!ApiResultVO.class.isAssignableFrom(returnType)) {
                   return;
               }
               // 强制类型转换
               ApiResultVO<Object> apiResultVO = (ApiResultVO<Object>) response.getBody();
               // 重新封装
               JsonResult<Object> jsonResult = new JsonResult<>();
               jsonResult.setCode(apiResultVO.getCode());
               jsonResult.setData(apiResultVO.getData());
               jsonResult.setMsg(apiResultVO.getMsg());
               response.setContentType(MediaType.APPLICATION_JSON_VALUE);
               response.setCharacterEncoding(StandardCharsets.UTF_8.name());
               response.getWriter().write(JsonUtils.toJson(jsonResult));
           }
       }
   }

}
```

  1. 创建一个注解 ApiResult,标记需要统一 JSON 格式返回结果的方法。

java
/**
* ApiResult 注解,标记需要统一 JSON 格式返回结果的方法
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiResult {
}

  1. 注册拦截器,放行操作

```java
@Configuration
public class ResponseHandlerConfig implements WebMvcConfigurer {

   @Autowired
   private ResponseHandlerInterceptor responseHandlerInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(responseHandlerInterceptor).addPathPatterns("/**");
   }

   @Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
               .allowedOrigins("*")
               .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
               .allowCredentials(false).maxAge(3600);
   }

}
```

  1. 在需要统一 JSON 格式返回结果的方法上加上 @ApiResult 注解即可。

java
/**
* 测试需要统一 JSON 格式返回结果的方法
* @return 返回 JSON 格式的数据
*/
@ApiResult
@GetMapping("/testJson")
public ApiResultVO<String> testJson() {
return ApiResultVO.success("测试成功");
}

2.2 使用自定义注解

我们可以通过自定义注解来实现简化操作。具体实现步骤如下:

  1. 创建一个注解 JsonResultFormat,标记需要统一 JSON 格式返回结果的类或方法。

java
/**
* JsonResultFormat 注解,标记需要统一 JSON 格式返回结果的类或方法
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonResultFormat {
}

  1. 创建一个拦截器类 JsonResultInterceptor,在接口调用完毕后修改返回的 JSON 格式。

```java
@Component
public class JsonResultInterceptor implements HandlerInterceptor {

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                               Exception ex) throws Exception {
       if (ex != null) {
           // 异常不处理
           return;
       }

       if (handler instanceof HandlerMethod) {
           HandlerMethod handlerMethod = (HandlerMethod) handler;
           Class<?> beanType = handlerMethod.getBeanType();
           JsonResultFormat jsonResultFormat = beanType.getAnnotation(JsonResultFormat.class);
           if (jsonResultFormat == null) {
               jsonResultFormat = handlerMethod.getMethodAnnotation(JsonResultFormat.class);
           }

           if (jsonResultFormat != null) {
               // 获取返回值的类型
               Class<?> returnType = handlerMethod.getReturnType().getParameterType();
               // 判断是否是统一返回格式要求的类型
               if (!ApiResultVO.class.isAssignableFrom(returnType)) {
                   return;
               }
               // 强制类型转换
               ApiResultVO<Object> apiResultVO = (ApiResultVO<Object>) response.getBody();
               // 重新封装
               JsonResult<Object> jsonResult = new JsonResult<>();
               jsonResult.setCode(apiResultVO.getCode());
               jsonResult.setData(apiResultVO.getData());
               jsonResult.setMsg(apiResultVO.getMsg());
               response.setContentType(MediaType.APPLICATION_JSON_VALUE);
               response.setCharacterEncoding(StandardCharsets.UTF_8.name());
               response.getWriter().write(JsonUtils.toJson(jsonResult));
           }
       }
   }

}
```

  1. 注册拦截器

```java
@Configuration
public class JsonResultInterceptorConfig implements WebMvcConfigurer {

   @Autowired
   private JsonResultInterceptor jsonResultInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(jsonResultInterceptor).addPathPatterns("/**");
   }

   @Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
               .allowedOrigins("*")
               .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
               .allowCredentials(false).maxAge(3600);
   }

}
```

  1. 在需要统一 JSON 格式返回结果的方法上加上 @JsonResultFormat 注解即可。

java
/**
* 测试需要统一 JSON 格式返回结果的方法
* @return 返回 JSON 格式的数据
*/
@JsonResultFormat
@GetMapping("/testJson")
public ApiResultVO<String> testJson() {
return ApiResultVO.success("测试成功");
}

2.3 统一异常处理

在项目中,统一异常处理也是非常重要的,我们可以在统一异常处理时,将异常信息封装成统一的 JSON 格式返回给前端。

首先,我们需要自定义一个异常类 JsonException,继承 RuntimeException,并添加需要的属性。

/**
* 统一 JSON 格式异常类
*/
public class JsonException extends RuntimeException {

   /**
    * 状态码
    */
   private Integer code;

   /**
    * 返回消息
    */
   private String msg;

   /**
    * 异常信息
    */
   private String errorMsg;

   /**
    * 构造函数
    * @param code 状态码
    * @param msg 状态消息
    * @param errorMsg 异常信息
    */
   public JsonException(Integer code, String msg, String errorMsg) {
       this.code = code;
       this.msg = msg;
       this.errorMsg = errorMsg;
   }

   public Integer getCode() {
       return code;
   }

   public void setCode(Integer code) {
       this.code = code;
   }

   public String getMsg() {
       return msg;
   }

   public void setMsg(String msg) {
       this.msg = msg;
   }

   public String getErrorMsg() {
       return errorMsg;
   }

   public void setErrorMsg(String errorMsg) {
       this.errorMsg = errorMsg;
   }
}

然后,我们需要自定义一个异常处理器 JsonExceptionHandler,捕获操作过程中可能出现的异常,并将其封装成统一的 JSON 格式返回前端。

@ControllerAdvice
public class JsonExceptionHandler {

   /**
    * 处理业务异常
    * @param e 业务异常
    * @param request 请求体
    * @return JSON 格式结果
    */
   @ExceptionHandler(value = JsonException.class)
   @ResponseBody
   public JsonResult<String> jsonExceptionHandler(JsonException e, HttpServletRequest request) {
       log.error("请求地址:[{}],错误信息:[{}]", request.getRequestURL(), e.getErrorMsg());
       JsonResult<String> result = new JsonResult<>();
       result.setCode(e.getCode());
       result.setMsg(e.getMsg());
       return result;
   }

   /**
    * 处理空指针异常
    * @param e 空指针异常
    * @param request 请求体
    * @return JSON 格式结果
    */
   @ExceptionHandler(value = NullPointerException.class)
   @ResponseBody
   public JsonResult<String> nullPointerExceptionHandler(NullPointerException e, HttpServletRequest request) {
       log.error("请求地址:[{}],错误信息:[{}]", request.getRequestURL(), e.getMessage());
       JsonResult<String> result = new JsonResult<>();
       result.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
       result.setMsg("系统繁忙,请稍后重试");
       return result;
   }

   /**
    * 处理其他错误异常
    * @param e 异常
    * @param request 请求体
    * @return JSON 格式结果
    */
   @ExceptionHandler(value = Exception.class)
   @ResponseBody
   public JsonResult<String> exceptionHandler(Exception e, HttpServletRequest request) {
       log.error("请求地址:[{}],错误信息:[{}]", request.getRequestURL(), e.getMessage());
       JsonResult<String> result = new JsonResult<>();
       result.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
       result.setMsg("系统繁忙,请稍后重试");
       return result;
   }

最后需要注意的是,在 ApiResultVOJsonResult 中,code 字段用于标记接口状态码,一般正常情况下为 0,而 msg 字段用于返回处理结果描述信息,data 字段返回数据内容。

3. 总结

本文介绍了三种实现统一 JSON 格式的接口返回结果的方法,分别是使用拦截器、自定义注解和统一异常处理。通过实现统一的返回格式,可以减少代码量,提升开发效率。同时,通过统一异常处理的方式,还可以将错误信息封装成统一 JSON 格式返回给前端,便于前端程序员查看和处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 统一JSON格式的接口返回结果的实现 - Python技术站

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

相关文章

  • Java工程如何打印程序日志过程解析

    下面我将详细讲解“Java工程如何打印程序日志过程解析”的完整攻略。 什么是程序日志 程序日志是指在程序运行过程中对程序行为进行记录的信息,包括但不限于程序运行错误、程序调试信息、程序状态等。 在Java工程中,常见的日志工具有Log4j、Logback等,它们将程序打印的日志信息输出到控制台、文件等位置,方便程序员了解程序的运行状态及定位程序错误。 日志级…

    Java 2023年5月26日
    00
  • java使用poi导出Excel的方法

    下面是关于”Java使用POI导出Excel的方法”的完整攻略。 简介 POI是Apache基金会的开源项目,可以用Java编写程序生成Microsoft Office文档格式,包括Word、Excel和PowerPoint。POI能够读取和写入Microsoft Office文件的各种属性和内容。在本教程中,我们将学习如何利用POI将数据导出到Excel文…

    Java 2023年5月20日
    00
  • Spring Cloud zuul自定义统一异常处理实现方法

    来详细讲解一下“Spring Cloud zuul自定义统一异常处理实现方法”的完整攻略。 1. 背景介绍 Zuul 是 Netflix 出品的一个基于 JVM 用于构建可伸缩的微服务架构的 API 网关服务器。Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,它将请求路由到相应的服务。Zuul 还能够对请求进行过滤,其中最常用的是安全过滤器…

    Java 2023年5月27日
    00
  • AndroidStudio4.1 自定义模板的使用方法

    AndroidStudio4.1 自定义模板的使用方法 简介 在开发 Android 应用过程中,我们经常需要创建大量的 Activity、Fragment、Adapter、ViewModel 等等。而每次新建这些文件都需要手动创建,费时费力,容易出错。Android Studio 就提供了模板功能,支持快速生成各种文件模板。在 Android Studio…

    Java 2023年6月1日
    00
  • Window下安装Tomcat服务器的教程

    下面是详细的“Window下安装Tomcat服务器的教程”攻略: 环境准备 Tomcat服务器下载 首先,需要从官网下载Tomcat服务器的安装包。Tomcat官网地址:http://tomcat.apache.org/ 在页面选择“Downloads” -> “Tomcat 10” -> “64-bit Windows zip”进行下载。 Ja…

    Java 2023年5月19日
    00
  • Java中Controller引起的Ambiguous mapping问题及解决

    首先我们需要明确什么是Controller及Ambiguous mapping问题。 什么是Controller 在Java Web应用中,Controller是一种将请求路由到相应处理程序的设计模式。在Spring MVC框架中,Controller是处理请求的核心组件,它负责接收请求、调用处理程序并返回响应。 什么是Ambiguous mapping问题…

    Java 2023年5月25日
    00
  • Java实现字符串切割的方法详解

    Java实现字符串切割的方法详解 在Java开发中,经常需要将一个字符串按照特定规则进行切割,切割后的字符串可以使用来进行各种操作。本文就 Java 实现字符串切割的方法进行详细的讲解 1、使用 split() 方法 Java内置的String类中,提供了 split() 方法,该方法可以实现对字符串按照特定规则进行切割,返回一个字符串数组。下面是使用 sp…

    Java 2023年5月26日
    00
  • SpringBoot整合阿里 Druid 数据源的实例详解

    SpringBoot整合阿里 Druid 数据源的实例详解 在SpringBoot项目中,我们经常会使用阿里的Druid数据源来管理我们的数据库连接。本文将详细讲解如何在SpringBoot项目中整合阿里Druid数据源。 步骤一:导入相关依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>com.…

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