优化异常处理
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
logTrack = LogTrackHolder.getNewMain();
|
||||||
|
}
|
||||||
LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e);
|
LogBus logBus = LogBus.init(level, type, logTrack).title(title).error(e);
|
||||||
if (Objects.nonNull(print)) {
|
if (Objects.nonNull(print)) {
|
||||||
logBus.print(print);
|
logBus.print(print);
|
||||||
}
|
}
|
||||||
logBus.save();
|
logBus.save();
|
||||||
} else {
|
|
||||||
log.error(title, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user