在 Spring Boot 项目中,统一的数据格式返回是一种良好的实践,它提高了代码的可维护性和一致性,并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。
首先,我们需要创建一个统一的响应类,用于封装 API 返回的数据:
- public class ApiResponse
{ - private int status;
- private String message;
- private T data;
-
- public ApiResponse(int status, String message, T data) {
- this.status = status;
- this.message = message;
- this.data = data;
- }
-
- // Getters and Setters
- }
这里使用@controller注解和ResponseBodyAdvice来实现
-
- @ControllerAdvice
- public class GlobalResponseBodyAdvice implements ResponseBodyAdvice
-
- @Override
- public boolean supports(MethodParameter returnType, Class converterType) {
- // 判断是否需要处理响应体
- return true;
- }
-
- @Override
- public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
- Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
- // 包装响应体
- if (body instanceof ApiResponse) {
- return body;
- }
- return new ApiResponse<>(HttpStatus.OK.value(), "Success", body);
- }
- }

为了保证异常也能返回统一的数据格式,我们需要创建一个全局异常处理类,博客 讲解了Spring Boot中如何进行统一异常处理。
- @ControllerAdvice //添加完此注解后,此类随着springboot项目的启动而启动,并且会监控controller的异常.监听项目中所有的异常
- @ResponseBody
- public class MyExceptionAdvice {
-
- //这里的一场都是意外异常,并不是业务异常,业务异常后端controller会处理返回给前端.业务异常会和前端沟通好已规定的状态码返回。
- @ExceptionHandler(NullPointerException.class)
- public ApiResponse
doNullPointerException(NullPointerException e){ - ApiResponse
apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null); - return apiResponse;
- }
-
- // 默认的异常处理,当有有异常出现的时候,会先匹配子类的异常,当所有的异常都没有匹配的时候就会走这一条默认的一场路线业务。
- @ExceptionHandler(Exception.class)
- public ApiResponse
doException(Exception e){ - ApiResponse
apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null); - return apiResponse;
- }
- }
观察异常出现情况下和正常访问情况下,是否都实现了统一格式返回。
-
- @RestController
- @RequestMapping("/user")
- public class UserController {
-
- @RequestMapping("login")
- public String login(){
- Object obj = null;
- System.out.println(obj.hashCode());
- return "这里是login";
- }
-
- @GetMapping("/data")
- public User getUserData() {
- // 这个方法会返回一个User对象
- User user = new User();
- user.setId(1);
- user.setName("张三");
- user.setEmail("zhangsan@example.com");
- return user;
- }
-
- @GetMapping("/success")
- public Integer getSuccessMessage() {
- // 这个方法会返回一个简单的字符串
- return 123456;
- }
- }

访问:127.0.0.1:8080/user/login 可以看到异常信息被统一处理并统一格式后返回。

访问127.0.0.1:8080/user/data ,可以看到接收到的数据也被统一处理。

访问127.0.0.1:8080/user/success ,可以看到接收到的数据也被统一处理。
总结
通过上述步骤,我们实现了使用@ControllerAdvice和ResponseBodyAdvice统一API数据返回格式的功能。这种方式不仅简化了代码,还使得API响应格式一致,更加规范和易于维护。