日志记录自动记录接口响应数据

This commit is contained in:
白茶清欢 2025-06-08 18:54:47 +08:00
parent d20294ae98
commit 8927b3323f
3 changed files with 42 additions and 17 deletions

View File

@ -2,6 +2,7 @@ package cn.zhangdeman.context;
import cn.zhangdeman.consts.RecordField;
import cn.zhangdeman.exception.CustomException;
import cn.zhangdeman.logger.LoggerInstance;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@ -45,7 +46,11 @@ public class Response<Data> implements Serializable {
@JsonProperty(RecordField.RESPONSE_COOKIE)
private Map<String, String> cookie = new HashMap<>(); // 响应cookie
@JsonIgnore
private String contentType = "application/json;charset=utf-8";
@JsonIgnore
private RuntimeContext runtimeContext;
@JsonIgnore
private Boolean handleSuccess; // 是否处理成功响应
// 响应实例
public Response(RuntimeContext runtimeContext) {
@ -90,48 +95,60 @@ public class Response<Data> implements Serializable {
}
// 请求成功, 200 状态码
public Response<Data> success(Data data) {
return success(HttpStatus.OK, data);
public Response<Data> success(RuntimeContext runtimeContext, Data data) {
return success(runtimeContext, HttpStatus.OK, data);
}
// 请求成功, 自定义http状态码
public Response<Data> success(HttpStatus httpStatus, Data data) {
public Response<Data> success(RuntimeContext runtimeContext, HttpStatus httpStatus, Data data) {
setHandleSuccess(true);
if (null == getCode()) {
setCode("0");
}
if (null == message) {
setMessage("请求成功");
}
return any(httpStatus, getCode(), getMessage(), data);
return any(runtimeContext, httpStatus, getCode(), getMessage(), data);
}
// 请求失败, 返回200
public Response<Data> failure(String code, String message, Object errorDetail) {
return failure(HttpStatus.OK, code, message, errorDetail);
public Response<Data> failure(RuntimeContext runtimeContext, String code, String message, Object errorDetail) {
return failure(runtimeContext, HttpStatus.OK, code, message, errorDetail);
}
public Response<Data> failure(HttpStatus httpStatus, String code, String message, Object errorDetail) {
public Response<Data> failure(RuntimeContext runtimeContext, HttpStatus httpStatus, String code, String message, Object errorDetail) {
setHandleSuccess(false);
setErrorDetail(errorDetail);
return any(httpStatus, code, message, null);
return any(runtimeContext, httpStatus, code, message, null);
}
public Response<Data> failure(CustomException customException) {
return failure(HttpStatus.OK, customException);
public Response<Data> failure(RuntimeContext runtimeContext, CustomException customException) {
return failure(runtimeContext, HttpStatus.OK, customException);
}
public Response<Data> failure(HttpStatus httpStatus, CustomException customException) {
public Response<Data> failure(RuntimeContext runtimeContext, HttpStatus httpStatus, CustomException customException) {
setHandleSuccess(false);
setErrorDetail(customException.getStackTrace()); // 异常堆栈
return any(httpStatus, customException.getCode(), customException.getMessage(), null);
return any(runtimeContext, httpStatus, customException.getCode(), customException.getMessage(), null);
}
// 任意姿势的响应
public Response<Data> any(HttpStatus httpStatus, String code, String message, Data data) {
public Response<Data> any(RuntimeContext runtimeContext, HttpStatus httpStatus, String code, String message, Data data) {
this.runtimeContext = runtimeContext;
setHttpStatus(httpStatus);
addHeader("Content-Type", getContentType()); // header追加响应类型
setHttpCode(httpStatus.value());
setCode(code);
setMessage(message);
setData(data);
setResponseHeaderAndCookie();
this.runtimeContext.setResponse((Response<Object>)this);
// 记录日志
if (getHandleSuccess()) {
LoggerInstance.REQUEST_OUTPUT_LOGGER.info("接口处理成功");
} else {
LoggerInstance.REQUEST_OUTPUT_LOGGER.error("接口处理失败");
}
return this;
}
// 序列化

View File

@ -37,7 +37,8 @@ public class RuntimeContext implements Serializable {
@JsonIgnore
private HttpServletRequest httpServletRequest;// 请求实例
@JsonIgnore
private HttpServletResponse httpServletResponse; // 相应实例
private HttpServletResponse httpServletResponse; // 响应实例
// 序列化
@Override

View File

@ -39,7 +39,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(cn.zhangdeman.exception.CustomException.class)
public ResponseEntity<Object> handleBusinessException(CustomException customException, HttpServletRequest httpServletRequest) {
RuntimeContext runtimeContext = getRuntimeContext(httpServletRequest);
Response<Object> response = new Response<>(runtimeContext).failure(customException);
Response<Object> response = new Response<>(runtimeContext).failure(runtimeContext, customException);
return getResponseEntity(response);
}
@ -62,16 +62,23 @@ public class GlobalExceptionHandler {
});
RuntimeContext runtimeContext = getRuntimeContext(httpServletRequest);
Response<Object> response = new Response<>(runtimeContext).failure("400", String.join(" - ", errors), errDetailList);
Response<Object> response = new Response<>(runtimeContext).failure(runtimeContext, "400", String.join(" - ", errors), errDetailList);
return getResponseEntity(response);
}
// 处理没有此方法的异常
@ExceptionHandler(java.lang.NoSuchMethodError.class)
public ResponseEntity<Object> handleNoSuchMethodException(Exception ex, HttpServletRequest httpServletRequest) {
RuntimeContext runtimeContext = getRuntimeContext(httpServletRequest);
Response<Object> response = new Response<>(runtimeContext).failure(runtimeContext,"500", ex.getMessage(), ex.getCause());
return getResponseEntity(response);
}
// 处理其他未捕获的异常
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleGlobalException(Exception ex, HttpServletRequest httpServletRequest) {
RuntimeContext runtimeContext = getRuntimeContext(httpServletRequest);
Response<Object> response = new Response<>(runtimeContext).failure("500", ex.getMessage(), ex.getCause());
Response<Object> response = new Response<>(runtimeContext).failure(runtimeContext,"500", ex.getMessage(), ex.getCause());
return getResponseEntity(response);
}
}