From b471ab5edf72439cf6e37c4635c07e7a5fc08a4f Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期二, 03 十一月 2026 19:10:14 +0800
Subject: [PATCH] fix(excel): Excel 导入报错统一转为可读中文提示,不再出现「系统异常」500
---
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java | 51 +++++++++++++++++++++++++++++++++++++--------------
1 files changed, 37 insertions(+), 14 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 97a63a2..cfd1cad 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,6 +36,7 @@
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 tools.jackson.databind.exc.InvalidFormatException;
@@ -50,7 +51,7 @@
/**
* 鍏ㄥ眬寮傚父澶勭悊鍣紝灏� Exception 缈昏瘧鎴� CommonResult + 瀵瑰簲鐨勫紓甯哥紪鍙�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@RestControllerAdvice
@AllArgsConstructor
@@ -96,6 +97,10 @@
}
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);
@@ -181,6 +186,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 +209,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 +377,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