From 730f9b0c25a6c111dab1ea4a1ac5e1da9a48f765 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期二, 03 十一月 2026 19:58:35 +0800
Subject: [PATCH] fix: 修复全量接口扫描发现的 500(29 个降至 0,member 模块按要求跳过)

---
 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java |   55 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
index 0eb7f5e..ab16966 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
@@ -36,8 +36,10 @@
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 import org.springframework.web.multipart.MaxUploadSizeExceededException;
+import org.springframework.web.multipart.MultipartException;
 import org.springframework.web.servlet.NoHandlerFoundException;
 import org.springframework.web.servlet.resource.NoResourceFoundException;
+import org.springdoc.api.OpenApiResourceNotFoundException;
 import tools.jackson.databind.exc.InvalidFormatException;
 
 import java.time.LocalDateTime;
@@ -97,11 +99,20 @@
         if (ex instanceof MaxUploadSizeExceededException) {
             return maxUploadSizeExceededExceptionHandler((MaxUploadSizeExceededException) ex);
         }
+        // 涓婁紶绫绘帴鍙f敹鍒伴潪 multipart 璇锋眰锛堝墠绔紡浼犳枃浠� / 鐢� JSON 璋冪敤浜嗗鍏ユ帴鍙o級灞炰簬瀹㈡埛绔棶棰橈紝涓嶅簲鎸� 500 澶勭悊
+        if (ex instanceof MultipartException) {
+            return multipartExceptionHandler((MultipartException) ex);
+        }
         if (ex instanceof NoHandlerFoundException) {
             return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex);
         }
         if (ex instanceof NoResourceFoundException) {
             return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex);
+        }
+        // /v3/api-docs/{group} 浼犲叆涓嶅瓨鍦ㄧ殑鍒嗙粍锛氬睘浜庤祫婧愪笉瀛樺湪锛屽簲杩斿洖 404 鑰屼笉鏄� 500
+        if (ex instanceof OpenApiResourceNotFoundException) {
+            log.warn("[openApiResourceNotFoundExceptionHandler][{}]", ex.getMessage());
+            return CommonResult.error(NOT_FOUND.getCode(), "鎺ュ彛鍒嗙粍涓嶅瓨鍦�: " + ex.getMessage());
         }
         if (ex instanceof HttpRequestMethodNotSupportedException) {
             return httpRequestMethodNotSupportedExceptionHandler((HttpRequestMethodNotSupportedException) ex);
@@ -181,6 +192,18 @@
      *
      * 渚嬪璇达紝鎺ュ彛涓婅缃簡 @RequestBody 瀹炰綋涓� xx 灞炴�х被鍨嬩负 Integer锛岀粨鏋滀紶閫� xx 鍙傛暟绫诲瀷涓� String
      */
+    /**
+     * 澶勭悊鏂囦欢涓婁紶鎺ュ彛鏀跺埌闈� multipart 璇锋眰
+     *
+     * <p>渚嬪璇达紝Excel 瀵煎叆鎺ュ彛婕忎紶 file 瀛楁銆佹垨鍓嶇鐢� application/json 璋冪敤浜嗗鍏ユ帴鍙c��
+     * 杩欑被閮芥槸瀹㈡埛绔敤娉曢棶棰橈紝杩斿洖 400 鏄庣‘鎻愮ず锛岃�屼笉鏄� 500銆岀郴缁熷紓甯搞�嶃��</p>
+     */
+    @ExceptionHandler(MultipartException.class)
+    public CommonResult<?> multipartExceptionHandler(MultipartException ex) {
+        log.warn("[multipartExceptionHandler]", ex);
+        return CommonResult.error(BAD_REQUEST.getCode(), "璇锋眰鍙傛暟涓嶆纭�:璇蜂娇鐢� multipart/form-data 涓婁紶鏂囦欢");
+    }
+
     @ExceptionHandler(HttpMessageNotReadableException.class)
     @SuppressWarnings("PatternVariableCanBeUsed")
     public CommonResult<?> methodArgumentTypeInvalidFormatExceptionHandler(HttpMessageNotReadableException ex) {
@@ -192,7 +215,9 @@
         if (StrUtil.startWith(ex.getMessage(), "Required request body is missing")) {
             return CommonResult.error(BAD_REQUEST.getCode(), "璇锋眰鍙傛暟绫诲瀷閿欒: request body 缂哄け");
         }
-        return defaultExceptionHandler(ServletUtils.getRequest(), ex);
+        // 鍏跺畠鍙嶅簭鍒楀寲澶辫触锛堝鎶婂璞′紶鎴愭暟缁勩�佸瓧娈电被鍨嬩笉鍖归厤锛夊悓鏍锋槸瀹㈡埛绔姤鏂囬棶棰橈紝涓嶅簲鎸� 500 澶勭悊
+        return CommonResult.error(BAD_REQUEST.getCode(),
+                String.format("璇锋眰鍙傛暟绫诲瀷閿欒:%s", StrUtil.maxLength(ex.getMessage(), 120)));
     }
 
     /**
@@ -358,27 +383,31 @@
         errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
         // 璁剧疆寮傚父瀛楁
         errorLog.setExceptionName(e.getClass().getName());
-        errorLog.setExceptionMessage(ExceptionUtil.getMessage(e));
-        errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e));
-        errorLog.setExceptionStackTrace(ExceptionUtil.stacktraceToString(e));
+        // infra_api_error_log 鐨勮繖浜涘垪閮芥槸 NOT NULL锛涜�� MyBatis-Plus 鎻掑叆鏃朵細璺宠繃 null 瀛楁锛�
+        // 浜庢槸浠讳竴瀛楁涓� null 閮戒細鍙樻垚 "Field 'xxx' doesn't have a default value"锛屽紓甯告棩蹇楀弽鑰岃涓嶄笅鏉�
+        errorLog.setExceptionMessage(StrUtil.nullToEmpty(ExceptionUtil.getMessage(e)));
+        errorLog.setExceptionRootCauseMessage(StrUtil.nullToEmpty(ExceptionUtil.getRootCauseMessage(e)));
+        errorLog.setExceptionStackTrace(StrUtil.nullToEmpty(ExceptionUtil.stacktraceToString(e)));
         StackTraceElement[] stackTraceElements = e.getStackTrace();
         Assert.notEmpty(stackTraceElements, "寮傚父 stackTraceElements 涓嶈兘涓虹┖");
         StackTraceElement stackTraceElement = stackTraceElements[0];
         errorLog.setExceptionClassName(stackTraceElement.getClassName());
-        errorLog.setExceptionFileName(stackTraceElement.getFileName());
-        errorLog.setExceptionMethodName(stackTraceElement.getMethodName());
+        // 鏍堥《鍏冪礌鍙兘鏄� native 鏂规硶鎴� Lambda锛実etFileName() 涓� null锛�
+        // infra_api_error_log 鐨勮繖浜涘垪鏄� NOT NULL锛屼负 null 浼氬鑷村紓甯告棩蹇楁彃鍏ュけ璐�
+        errorLog.setExceptionFileName(StrUtil.nullToEmpty(stackTraceElement.getFileName()));
+        errorLog.setExceptionMethodName(StrUtil.nullToEmpty(stackTraceElement.getMethodName()));
         errorLog.setExceptionLineNumber(stackTraceElement.getLineNumber());
         // 璁剧疆鍏跺畠瀛楁
-        errorLog.setTraceId(TracerUtils.getTraceId());
-        errorLog.setApplicationName(applicationName);
-        errorLog.setRequestUrl(request.getRequestURI());
+        errorLog.setTraceId(StrUtil.nullToEmpty(TracerUtils.getTraceId()));
+        errorLog.setApplicationName(StrUtil.nullToEmpty(applicationName));
+        errorLog.setRequestUrl(StrUtil.nullToEmpty(request.getRequestURI()));
         Map<String, Object> requestParams = MapUtil.<String, Object>builder()
                 .put("query", ServletUtils.getParamMap(request))
                 .put("body", ServletUtils.getBody(request)).build();
-        errorLog.setRequestParams(JsonUtils.toJsonString(requestParams));
-        errorLog.setRequestMethod(request.getMethod());
-        errorLog.setUserAgent(ServletUtils.getUserAgent(request));
-        errorLog.setUserIp(ServletUtils.getClientIP(request));
+        errorLog.setRequestParams(StrUtil.nullToEmpty(JsonUtils.toJsonString(requestParams)));
+        errorLog.setRequestMethod(StrUtil.nullToEmpty(request.getMethod()));
+        errorLog.setUserAgent(StrUtil.nullToEmpty(ServletUtils.getUserAgent(request)));
+        errorLog.setUserIp(StrUtil.nullToEmpty(ServletUtils.getClientIP(request)));
         errorLog.setExceptionTime(LocalDateTime.now());
     }
 

--
Gitblit v1.9.3