Spring Boot 统一响应体处理器详解

开发 前端
通过ResultHandlerAdvice,我们实现了一个简单而有效的全局响应体处理器,确保了API的统一响应格式。这样的设计不仅提高了代码的可维护性,还使得团队开发中更容易达成统一规范,提升了项目的整体质量。

在Spring Boot应用中,统一处理响应体是一项非常重要的任务,它可以让我们更方便地统一规范API的返回格式。今天,我们将深入探讨一个优雅的解决方案——使用ResultHandlerAdvice,通过它实现统一响应体的增强处理。

背景

在实际项目中,我们经常会面临API返回的统一格式要求,而不同的Controller可能返回不同类型的数据。为了解决这个问题,我们可以使用Spring Boot的ControllerAdvice和ResponseBodyAdvice来实现全局的响应体处理。

实现

首先,让我们看一下如何通过代码实现这个处理器。以下是一个简单的例子:

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;


/**
 * 统一响应体增强处理器
 */
@ControllerAdvice(basePackages = "com.example.controller")
@Slf4j
public class ResultHandlerAdvice implements ResponseBodyAdvice {


    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        log.info("returnType:" + returnType);
        log.info("converterType:" + converterType);
        return true;
    }


    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (MediaType.APPLICATION_JSON.equals(selectedContentType)) { // 判断响应的Content-Type为JSON格式的body
            if (body instanceof Result) { // 如果响应返回的对象为统一响应体,则直接返回body
                return body;
            } else {
                // 只有正常返回的结果才会进入这个判断流程,所以返回正常成功的状态码
                Result result = Result.buildSuccessResult(body);
                return result;
            }
        }
        // 非JSON格式body直接返回即可
        return body;
    }
}
  1. @ControllerAdvice 注解:通过这个注解,我们告诉Spring Boot这是一个全局控制器增强的类,用于统一处理Controller的返回值。
  2. supports 方法:在这个方法中,我们可以指定哪些类型的返回值需要被拦截。在这里,我们返回true表示拦截所有类型的返回值。
  3. beforeBodyWrite 方法:这是关键的方法,它在响应体写入之前被调用。我们可以在这里对返回的结果进行处理,确保其符合我们的统一格式。在这个例子中,我们判断如果返回的不是统一响应体 Result 类型,就包装成 Result 类型再返回。

应用

使用这个处理器后,所有被@ControllerAdvice注解标注的Controller都将受到影响。这意味着,无论哪个Controller返回的数据,都会经过我们定义的处理逻辑,确保响应的统一性。

@RestController
@RequestMapping("/api")
public class MyController {


    @GetMapping("/data")
    public MyData getData() {
        // 实际业务逻辑...
        return new MyData("Hello, World!");
    }
}
MyData
Result

总结

通过ResultHandlerAdvice,我们实现了一个简单而有效的全局响应体处理器,确保了API的统一响应格式。这样的设计不仅提高了代码的可维护性,还使得团队开发中更容易达成统一规范,提升了项目的整体质量。希望这篇文章对你理解和使用Spring Boot中的全局响应体处理有所帮助!

责任编辑:武晓燕 来源: 柳岸花开
相关推荐

2021-04-30 07:34:01

Spring BootController项目

2011-04-21 16:51:16

一体电脑处理器

2013-05-10 10:12:32

英特尔至强处理器

2011-03-18 09:37:40

spring

2010-03-29 02:21:12

AMDMagny Cours12核

2017-05-18 14:14:25

过滤器Spring ClouZuul

2019-08-22 14:02:00

Spring BootRestful APIJava

2012-06-27 15:09:31

戴尔一体机

2017-05-19 15:13:05

过滤器Spring ClouZuul

2023-04-07 07:49:19

PC处理器移动

2017-07-31 15:47:50

Zuul统一处理

2017-04-26 11:00:34

Spring BootHelloWorld详解

2012-02-01 15:19:22

同方一体机

2014-09-09 09:49:59

2009-03-01 21:30:46

Mac OS X 10Nehalem处理器

2022-11-10 15:49:45

2023-09-13 08:56:51

2012-03-07 14:17:07

清华同方一体机

2009-07-30 18:48:06

多核六核处理器

2022-04-08 16:27:48

SpringBoot异常处理
点赞
收藏

51CTO技术栈公众号