Browse Source

fix:全局异常拦截+接口请求id

wangzaijun 7 months ago
parent
commit
43eabfd41b

+ 1 - 1
service-deploy/pom.xml

@@ -10,7 +10,7 @@
 
     <artifactId>service-deploy</artifactId>
     <version>1.0.0</version>
-    <name>data-daq</name>
+    <name>service-deploy</name>
     <description>数据采集系统入口</description>
 
     <dependencies>

+ 15 - 0
service-deploy/src/main/java/com/simuwang/deploy/components/RequestIdContext.java

@@ -0,0 +1,15 @@
+package com.simuwang.deploy.components;
+
+import org.slf4j.MDC;
+
+public class RequestIdContext {
+    public final static String X_API_REQUESTID = "x-api-requestid";
+
+    public static String getRequestId() {
+        return MDC.get(X_API_REQUESTID);
+    }
+
+    public static void setRequestId(String requestId) {
+        MDC.put(X_API_REQUESTID, requestId);
+    }
+}

+ 20 - 0
service-deploy/src/main/java/com/simuwang/deploy/components/RequestIdInterceptor.java

@@ -0,0 +1,20 @@
+package com.simuwang.deploy.components;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+public class RequestIdInterceptor implements HandlerInterceptor {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        String requestId = request.getHeader(RequestIdContext.X_API_REQUESTID);
+        if (StrUtil.isBlank(requestId)) {
+            requestId = IdUtil.simpleUUID();
+        }
+        RequestIdContext.setRequestId(requestId);
+        response.setHeader(RequestIdContext.X_API_REQUESTID, requestId);
+        return HandlerInterceptor.super.preHandle(request, response, handler);
+    }
+}

+ 2 - 1
service-deploy/src/main/java/com/simuwang/deploy/components/GlobalErrorController.java

@@ -1,6 +1,7 @@
-package com.simuwang.deploy.components;
+package com.simuwang.deploy.config;
 
 import com.simuwang.base.common.exception.ErrorInfo;
+import com.simuwang.deploy.components.ErrorInfoBuilder;
 import com.smppw.common.pojo.ResultVo;
 import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.boot.web.servlet.error.ErrorController;

+ 18 - 3
service-deploy/src/main/java/com/simuwang/deploy/components/GlobalResponseBodyAdvice.java

@@ -1,9 +1,14 @@
-package com.simuwang.deploy.components;
+package com.simuwang.deploy.config;
 
 import cn.hutool.json.JSONUtil;
 import com.smppw.common.pojo.ResultVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.MethodParameter;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.HttpStatusCode;
 import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.server.ServerHttpRequest;
 import org.springframework.http.server.ServerHttpResponse;
@@ -17,10 +22,11 @@ import java.util.Arrays;
 /**
  * @author wangzaijun
  * @date 2023/8/12 16:39
- * @description 全局的异常处理
+ * @description 全局的结果处理工具
  */
 @RestControllerAdvice
 public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
     private static final Class[] ANNOTATIONS = new Class[]{
             RequestMapping.class,
             PostMapping.class,
@@ -37,7 +43,8 @@ public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
 
     @Override
     public Object beforeBodyWrite(Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType,
-                                  @NonNull Class<? extends HttpMessageConverter<?>> selectedConverterType, @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
+                                  @NonNull Class<? extends HttpMessageConverter<?>> selectedConverterType,
+                                  @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) {
         if (body instanceof String) {
             // 当响应体是String类型时
             return JSONUtil.toJsonStr(ResultVo.ok(body));
@@ -46,6 +53,14 @@ public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
             // 已经包装过的结果无需再次包装
             return body;
         }
+        if (body instanceof ResponseEntity<?> entity) {
+            HttpStatusCode statusCode = entity.getStatusCode();
+            if (statusCode.value() == HttpStatus.OK.value()) {
+                return ResultVo.ok(entity.getBody());
+            }
+            this.logger.warn("全局统一数据返回,接口{} 请求错误\n{}", request.getURI(), body);
+            return ResultVo.fail(statusCode.value(), "接口请求错误");
+        }
         // 对响应体进行包装
         return ResultVo.ok(body);
     }

+ 14 - 0
service-deploy/src/main/java/com/simuwang/deploy/config/WebConfig.java

@@ -0,0 +1,14 @@
+package com.simuwang.deploy.config;
+
+import com.simuwang.deploy.components.RequestIdInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+       registry.addInterceptor(new RequestIdInterceptor()).addPathPatterns("/**");
+    }
+}

+ 1 - 1
service-deploy/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="true">
     <!-- 日志格式:年-月-日 时:分:秒 [线程] 日志级别 所在类:行号 - 具体信息 换行 -->
-    <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%-4L - %msg%n"/>
+    <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] - [%X{x-api-requestid}] %-5level %logger{50}:%-4L - %msg%n"/>
     <property name="LOG_HOME" value="./logs"/>
 
     <!--输出到控制台-->