优化异常处理

This commit is contained in:
2026-04-25 16:15:37 +08:00
parent 4715f47476
commit 58c8dc9bb8
2 changed files with 85 additions and 21 deletions

View File

@@ -95,17 +95,7 @@ public class LogTrackHolder {
*/ */
public static LogTrack get() { public static LogTrack get() {
Instant now = Instant.now(); Instant now = Instant.now();
HolderLogTrack holder = getHolder(); return packageLogTrack(now, getHolder());
holder.getCount().getAndIncrement();
return new LogTrack(
UuidUtils.get(),
now.toEpochMilli(),
holder.getTraceId(),
holder.getParentId(),
holder.getType(),
holder.getCount().get(),
holder.isSave()
);
} }
/** /**
@@ -119,6 +109,27 @@ public class LogTrackHolder {
if (Objects.isNull(holder)) { if (Objects.isNull(holder)) {
return null; 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(); holder.getCount().getAndIncrement();
return new LogTrack( return new LogTrack(
UuidUtils.get(), UuidUtils.get(),

View File

@@ -3,6 +3,10 @@ package xtools.boot.web.base.exception;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.connector.ClientAbortException; 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.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MethodArgumentNotValidException;
@@ -27,6 +31,7 @@ import xtools.core.StringUtils;
import xtools.core.enums.LogLevel; import xtools.core.enums.LogLevel;
import xtools.core.extend.TemplateUtils; import xtools.core.extend.TemplateUtils;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.StringJoiner; import java.util.StringJoiner;
@@ -193,9 +198,58 @@ public class GlobalControllerExceptionHandler implements BaseParams {
* @return 错误结果 * @return 错误结果
*/ */
@ExceptionHandler(NoResourceFoundException.class) @ExceptionHandler(NoResourceFoundException.class)
public Result<Object> handleNoResourceFoundException(NoResourceFoundException e) { public ResponseEntity<?> handleNoResourceFoundException(NoResourceFoundException e, HttpServletRequest request) {
errorLog(LogLevel.WARN, LogBusBaseType.CONTROLLER, "资源未找到", e, false); 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<MediaType> 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) { private void errorLog(LogLevel level, LogBusType type, String title, Exception e, Boolean print) {
LogTrack logTrack = LogTrackHolder.getDefNull(); LogTrack logTrack = LogTrackHolder.getDefNull();
if (Objects.nonNull(logTrack)) { if (Objects.isNull(logTrack)) {
LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e); logTrack = LogTrackHolder.getNewMain();
if (Objects.nonNull(print)) {
logBus.print(print);
}
logBus.save();
} else {
log.error(title, e);
} }
LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e);
if (Objects.nonNull(print)) {
logBus.print(print);
}
logBus.save();
} }
/** /**