赞
踩
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字段,用于表示具体的返回内容。类中提供了两个静态方法 success
和 error
,用于创建成功和错误的响应对象。
在控制器(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
方法返回一个错误的响应,不包含具体的数据。根据需要,你可以在不同的控制器方法中使用不同的泛型类型。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
接口是 Spring 框架提供的用于处理响应体的拦截器接口,主要用于在返回响应之前和之后对响应体进行修改或处理。该接口包含两个方法:supports
和 beforeBodyWrite
。
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;
}
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
进行包装。这样可以实现全局的统一响应格式。
在 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 的统一格式的响应。你可以根据实际需求进一步优化异常处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。