From 58c8dc9bb82e18017e035dce103755638911cb96 Mon Sep 17 00:00:00 2001 From: xujun Date: Sat, 25 Apr 2026 16:15:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/log/holder/LogTrackHolder.java | 33 ++++++--- .../GlobalControllerExceptionHandler.java | 73 ++++++++++++++++--- 2 files changed, 85 insertions(+), 21 deletions(-) diff --git a/xtools-boot-log/src/main/java/xtools/boot/log/holder/LogTrackHolder.java b/xtools-boot-log/src/main/java/xtools/boot/log/holder/LogTrackHolder.java index 7519407..a444c5f 100644 --- a/xtools-boot-log/src/main/java/xtools/boot/log/holder/LogTrackHolder.java +++ b/xtools-boot-log/src/main/java/xtools/boot/log/holder/LogTrackHolder.java @@ -95,17 +95,7 @@ public class LogTrackHolder { */ public static LogTrack get() { Instant now = Instant.now(); - HolderLogTrack holder = getHolder(); - holder.getCount().getAndIncrement(); - return new LogTrack( - UuidUtils.get(), - now.toEpochMilli(), - holder.getTraceId(), - holder.getParentId(), - holder.getType(), - holder.getCount().get(), - holder.isSave() - ); + return packageLogTrack(now, getHolder()); } /** @@ -119,6 +109,27 @@ public class LogTrackHolder { if (Objects.isNull(holder)) { return null; } + return packageLogTrack(now, holder); + } + + /** + * 获取新建Main日志追踪信息 + * + * @return 新建Main日志追踪信息 + */ + public static LogTrack getNewMain() { + Instant now = Instant.now(); + return packageLogTrack(now, newMain()); + } + + /** + * 包装日志追踪信息 + * + * @param now 时间 + * @param holder 日志追踪信息 + * @return 日志追踪信息 + */ + private static LogTrack packageLogTrack(Instant now, HolderLogTrack holder) { holder.getCount().getAndIncrement(); return new LogTrack( UuidUtils.get(), diff --git a/xtools-boot-web/xtools-boot-web-base/src/main/java/xtools/boot/web/base/exception/GlobalControllerExceptionHandler.java b/xtools-boot-web/xtools-boot-web-base/src/main/java/xtools/boot/web/base/exception/GlobalControllerExceptionHandler.java index 3fcf988..552a8b6 100644 --- a/xtools-boot-web/xtools-boot-web-base/src/main/java/xtools/boot/web/base/exception/GlobalControllerExceptionHandler.java +++ b/xtools-boot-web/xtools-boot-web-base/src/main/java/xtools/boot/web/base/exception/GlobalControllerExceptionHandler.java @@ -3,6 +3,10 @@ package xtools.boot.web.base.exception; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.ClientAbortException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -27,6 +31,7 @@ import xtools.core.StringUtils; import xtools.core.enums.LogLevel; import xtools.core.extend.TemplateUtils; +import java.util.List; import java.util.Objects; import java.util.StringJoiner; @@ -193,9 +198,58 @@ public class GlobalControllerExceptionHandler implements BaseParams { * @return 错误结果 */ @ExceptionHandler(NoResourceFoundException.class) - public Result handleNoResourceFoundException(NoResourceFoundException e) { + public ResponseEntity handleNoResourceFoundException(NoResourceFoundException e, HttpServletRequest request) { errorLog(LogLevel.WARN, LogBusBaseType.CONTROLLER, "资源未找到", e, false); - return new Result<>(ResultType.NOT_FOUND, null); + if (checkTextResponse(request)) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new Result<>(ResultType.NOT_FOUND, null)); + } else { + return ResponseEntity.notFound().build(); + } + } + + /** + * 检查是否为文本响应 + * + * @param request 请求 + * @return 是否为文本响应 + */ + private boolean checkTextResponse(HttpServletRequest request) { + String acceptHeader = request.getHeader(HttpHeaders.ACCEPT); + if (StringUtils.isBlank(acceptHeader)) { + return true; + } + List acceptedTypes = MediaType.parseMediaTypes(acceptHeader); + for (MediaType item : acceptedTypes) { + // 通配符 */* 表示可接受任意类型,包括文本 + if (item.equals(MediaType.ALL)) { + return true; + } + String type = item.getType(); + switch (type) { + case "text" -> { + return true; + } + case "image", "multipart" -> { + return false; + } + } + if ( + item.isCompatibleWith(MediaType.APPLICATION_ATOM_XML) || + item.isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED) || + item.isCompatibleWith(MediaType.APPLICATION_GRAPHQL_RESPONSE) || + item.isCompatibleWith(MediaType.APPLICATION_JSON) || + item.isCompatibleWith(MediaType.APPLICATION_NDJSON) || + item.isCompatibleWith(MediaType.APPLICATION_PROBLEM_JSON) || + item.isCompatibleWith(MediaType.APPLICATION_PROBLEM_XML) || + item.isCompatibleWith(MediaType.APPLICATION_RSS_XML) || + item.isCompatibleWith(MediaType.APPLICATION_XHTML_XML) || + item.isCompatibleWith(MediaType.APPLICATION_XML) || + item.isCompatibleWith(MediaType.APPLICATION_YAML) + ) { + return true; + } + } + return false; } /** @@ -243,15 +297,14 @@ public class GlobalControllerExceptionHandler implements BaseParams { */ private void errorLog(LogLevel level, LogBusType type, String title, Exception e, Boolean print) { LogTrack logTrack = LogTrackHolder.getDefNull(); - if (Objects.nonNull(logTrack)) { - LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e); - if (Objects.nonNull(print)) { - logBus.print(print); - } - logBus.save(); - } else { - log.error(title, e); + if (Objects.isNull(logTrack)) { + logTrack = LogTrackHolder.getNewMain(); } + LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e); + if (Objects.nonNull(print)) { + logBus.print(print); + } + logBus.save(); } /**