统一响应结果vo 全局异常处理器 统一返回

springboot2 项目 统一响应结果vo 返回类3个基础参数,一个code,一个msg,一个data,data就用来做具体返回的内容,用泛型,想返回啥就返回啥;

在 Spring Boot 项目中,你可以创建一个统一的响应结果类(VO),其中包含了三个基础参数:code、msg、data。你可以使用泛型来表示data字段的类型,以便实现灵活的数据返回。

以下是一个简单的示例代码:

public class ApiResponse<T> {
    private int code;
    private String msg;
    private T data;

    public ApiResponse() {
        // 默认构造函数
    }

    public ApiResponse(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 省略 getter 和 setter 方法

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "Success", data);
    }

    public static <T> ApiResponse<T> error(int code, String msg) {
        return new ApiResponse<>(code, msg, null);
    }
}

在这个示例中,ApiResponse 类包含了一个带有泛型的data字段,用于表示具体的返回内容。类中提供了两个静态方法 successerror,用于创建成功和错误的响应对象。

在控制器(Controller)中,你可以使用这个响应对象来统一返回结果:

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

    @GetMapping("/example")
    public ApiResponse<String> getExample() {
        String exampleData = "Hello, World!";
        return ApiResponse.success(exampleData);
    }

    @GetMapping("/error")
    public ApiResponse<?> handleError() {
        return ApiResponse.error(500, "Internal Server Error");
    }
}

在这个例子中,getExample 方法返回一个成功的响应,包含了字符串类型的数据。handleError 方法返回一个错误的响应,不包含具体的数据。根据需要,你可以在不同的控制器方法中使用不同的泛型类型。
前端根据code写返回逻辑,正常code是0,不是0的全是异常

springboot2 用 ResponseBodyAdvice 实现统一响应数据格式ApiResponse

Spring MVC 切面 ResponseBodyAdvice 对响应/返回值增强、API接口数据统一格式返回-CSDN博客
https://blog.csdn.net/wangmx1993328/article/details/81054474/

在 Spring Boot 中,你可以使用 ResponseBodyAdvice 接口来实现统一响应数据格式,将响应的数据包装成 ApiResponse 对象。ResponseBodyAdvice 接口提供了在响应体写入之前和之后执行的方法,使你能够对响应进行处理。

以下是一个简单的示例,演示如何使用 ResponseBodyAdvice 实现统一响应数据格式:

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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
public class ApiResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 确保只有返回类型为 ApiResponse 时才执行 beforeBodyWrite 方法
        return !ResponseEntity.class.isAssignableFrom(returnType.getParameterType());
    }

    @Override
    public Object beforeBodyWrite(
            Object body,
            MethodParameter returnType,
            MediaType selectedContentType,
            Class selectedConverterType,
            ServerHttpRequest request,
            ServerHttpResponse response) {

        // 如果返回类型是 ApiResponse,则直接返回
        if (body instanceof ApiResponse) {
            return body;
        }

        // 对其他返回类型进行包装
        if (body instanceof String) {
            // 如果是字符串类型,则包装成 ApiResponse
            return ApiResponse.success(body);
        } else {
            // 对其他类型进行包装
            return ApiResponse.success(body);
        }
    }
}

在上述代码中,ApiResponseAdvice 类实现了 ResponseBodyAdvice 接口。supports 方法用于确定是否应该执行 beforeBodyWrite 方法。在 beforeBodyWrite 方法中,我们检查响应的数据类型,如果是 ApiResponse 类型则直接返回,否则将其包装成 ApiResponse 对象。

请注意,上述示例中的包装逻辑可能需要根据你的实际需求进行调整。你可以根据实际情况对不同类型的响应进行不同的包装处理。


ResponseBodyAdvice 2个方法的详细用法

ResponseBodyAdvice 接口是 Spring 框架提供的用于处理响应体的拦截器接口,主要用于在返回响应之前和之后对响应体进行修改或处理。该接口包含两个方法:supportsbeforeBodyWrite

1. supports 方法

boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);

supports 方法用于判断是否应该执行 beforeBodyWrite 方法。通常,你可以在这个方法中根据条件判断是否需要对响应进行处理。如果返回 true,则执行 beforeBodyWrite 方法;如果返回 false,则不执行。

例如,你可以通过判断返回类型、请求头等条件来决定是否进行处理:

@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    // 判断返回类型是否是需要处理的类型
    return returnType.getParameterType() == YourResponseType.class;
}

2. beforeBodyWrite 方法

T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType,
    Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
    ServerHttpResponse response);

beforeBodyWrite 方法用于在将响应体写入到响应之前进行处理。你可以在这个方法中对响应体进行修改、包装或其他处理。该方法的返回值即为最终写入响应的响应体。

例如,你可以在这个方法中对响应体进行包装:

@Override
public ApiResponse<Object> beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
        Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
        ServerHttpResponse response) {

    // 对响应体进行包装
    ApiResponse<Object> apiResponse = new ApiResponse<>(200, "Success", body);
    return apiResponse;
}

在这个例子中,ApiResponse 类型用于包装响应体。

使用示例

下面是一个完整的使用示例,假设有一个统一的响应格式 ApiResponse

@ControllerAdvice
public class ApiResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // 判断返回类型是否是需要处理的类型
        return returnType.getParameterType() == YourResponseType.class;
    }

    @Override
    public ApiResponse<Object> beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {

        // 对响应体进行包装
        ApiResponse<Object> apiResponse = new ApiResponse<>(200, "Success", body);
        return apiResponse;
    }
}

在这个例子中,YourResponseType 是你希望进行处理的响应类型。如果返回的响应体类型是 YourResponseType,则在返回之前使用 ApiResponse 进行包装。这样可以实现全局的统一响应格式。


统一返回ResponseEntity 用法 示例

在 Spring Boot 中,你可以使用 ResponseEntity 类来实现统一的 HTTP 响应,该类提供了更灵活的方式来控制 HTTP 响应的状态码、头部信息和响应体。下面是一个简单的示例,演示如何使用 ResponseEntity 来实现统一的响应:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @GetMapping("/example")
    public ResponseEntity<ApiResponse<String>> getExample() {
        try {
            // 执行业务逻辑
            String result = "Hello, World!";
            return ResponseEntity.ok(new ApiResponse<>(200, "Success", result));
        } catch (Exception e) {
            // 处理异常情况
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(new ApiResponse<>(500, "Internal Server Error", null));
        }
    }
}

在这个例子中,ApiResponse 是一个自定义的响应体类,用于表示统一的响应格式。MyController 类中的 getExample 方法返回一个 ResponseEntity<ApiResponse<String>> 类型的响应。

  • ResponseEntity.ok() 方法表示响应状态码为 200。
  • ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) 方法表示响应状态码为 500。

你可以根据业务逻辑的成功与否选择不同的状态码,并根据需要设置响应头和响应体。

此外,如果你希望在全局处理异常并返回统一格式的响应,你可以使用全局异常处理器(@ControllerAdvice@ExceptionHandler)。以下是一个简单的全局异常处理器的示例:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ApiResponse<Object>> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(new ApiResponse<>(500, "Internal Server Error", null));
    }
}

这个全局异常处理器捕获所有的异常,并返回一个状态码为 500 的统一格式的响应。你可以根据实际需求进一步优化异常处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值