From 94423833dcaf85f710a1bb627d1f95f0c8b293ae Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Mon, 9 Dec 2024 16:41:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(gateway):=20=E6=B7=BB=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=93=8D=E5=BA=94=E5=A4=84=E7=90=86=E5=99=A8=E5=92=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E5=B0=81?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 GlobalResponseHandler 类实现全局响应处理 - 添加 Result 类用于统一返回结果封装 - 实现 JsonUtil 工具类用于对象与 JSON 字符串转换 -优化了返回类型为 String 时的处理逻辑 --- .../response/GlobalResponseHandler.java | 65 +++++++++++++++++++ .../gateway/framework/response/JsonUtil.java | 26 ++++++++ .../gateway/framework/response/Result.java | 51 +++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 src/main/java/com/zsc/edu/gateway/framework/response/GlobalResponseHandler.java create mode 100644 src/main/java/com/zsc/edu/gateway/framework/response/JsonUtil.java create mode 100644 src/main/java/com/zsc/edu/gateway/framework/response/Result.java diff --git a/src/main/java/com/zsc/edu/gateway/framework/response/GlobalResponseHandler.java b/src/main/java/com/zsc/edu/gateway/framework/response/GlobalResponseHandler.java new file mode 100644 index 0000000..dffbca2 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/response/GlobalResponseHandler.java @@ -0,0 +1,65 @@ +package com.zsc.edu.gateway.framework.response; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 响应统一封装 + *

+ * 将响应数据,封装成统一的数据格式。 + *

+ * 通过本处理器,将接口方法返回的数据,统一封装到 Result 的 data 字段中,如果接口方法返回为 void,则 data 字段的值为 null。 + * + * @author zhuang + */ +@Slf4j +@RestControllerAdvice(basePackages = "com.example.web") +public class GlobalResponseHandler implements ResponseBodyAdvice { + + /** + * 此组件是否支持给定的控制器方法返回类型和选定的 {@code HttpMessageConverter} 类型。 + * + * @return 如果应该调用 {@link #beforeBodyWrite} ,则为 {@code true};否则为false。 + */ + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + // 返回类型不为Result,才需要封装 + return returnType.getParameterType() != Result.class; + } + + + /** + * 统一封装返回响应数据 + */ + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, + Class> selectedConverterType, ServerHttpRequest request, + ServerHttpResponse response) { + + // 数据封装为Result:将接口方法返回的数据,封装到 Result.data 字段中。 + Result result = Result.success(body); + + // 返回类型不是 String:直接返回 + if (returnType.getParameterType() != String.class) { + return result; + } + + // 返回类型是 String:不能直接返回,需要进行额外处理 + // 1. 将 Content-Type 设为 application/json ;返回类型是String时,默认 Content-Type = text/plain + HttpHeaders headers = response.getHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + // 2. 将 Result 转为 Json字符串 再返回 + // (否则会报错 java.lang.ClassCastException: com.example.core.model.Result cannot be cast to java.lang.String) + return JsonUtil.toJson(result); + } + +} + diff --git a/src/main/java/com/zsc/edu/gateway/framework/response/JsonUtil.java b/src/main/java/com/zsc/edu/gateway/framework/response/JsonUtil.java new file mode 100644 index 0000000..0d7fbbc --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/response/JsonUtil.java @@ -0,0 +1,26 @@ +package com.zsc.edu.gateway.framework.response; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * @author zhuang + */ +public class JsonUtil { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 将对象转换为 JSON 字符串 + * + * @param obj 需要转换的对象 + * @return JSON 字符串 + */ + public static String toJson(Object obj) { + try { + return objectMapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to convert object to JSON", e); + } + } +} diff --git a/src/main/java/com/zsc/edu/gateway/framework/response/Result.java b/src/main/java/com/zsc/edu/gateway/framework/response/Result.java new file mode 100644 index 0000000..c571a03 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/response/Result.java @@ -0,0 +1,51 @@ +package com.zsc.edu.gateway.framework.response; + +import lombok.*; + +/** + * 返回响应,统一封装实体 + * + * @param 数据实体泛型 + * @author zhuang + */ +@Getter +@ToString +@EqualsAndHashCode +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Result { + + private String userMessage; + + /** + * 错误码
+ * 调用成功时,为 null。
+ * 示例:A0211 + */ + private String errorCode; + + /** + * 错误信息
+ * 调用成功时,为 null。
+ * 示例:"用户输入密码错误次数超限" + */ + private String errorMessage; + + /** + * 数据实体(泛型)
+ * 当接口没有返回数据时,为 null。 + */ + private T data; + + + public static Result success(T data) { + return new Result<>("操作成功!", null, null, data); + } + + + public static Result fail(String userMessage, String errorCode, String errorMessage) { + return new Result<>(userMessage, errorCode, errorMessage, null); + } + +} + +