我自定义了一个DefaultErrorWebExceptionHandler,用来统一捕获异常
请问一下,如果我如何把自定义的属性比如用户id加入到这个类里面进行统一处理呢?
我自定义了一个DefaultErrorWebExceptionHandler,用来统一捕获异常
🕒下午好,题主!目前:🟢[在线]
📢参考GPT-4o mini 模型、由清水白石008整理提供!
📣今日金句:“最伟大的荣耀不在于从不跌倒,而在于每次跌倒后都能站起来。” — 纳尔逊·曼德拉
要在自定义的 DefaultErrorWebExceptionHandler
中统一处理异常并将用户 ID 等自定义属性加入到响应中,你可以按照以下步骤进行:
首先,确保你有一个自定义异常类,能够携带用户 ID 或其他相关信息。例如:
public class CustomException extends RuntimeException {
private final String userId;
public CustomException(String message, String userId) {
super(message);
this.userId = userId;
}
public String getUserId() {
return userId;
}
}
在你的 DefaultErrorWebExceptionHandler
中,你可以捕获这些自定义异常,并从中提取用户 ID。以下是一个示例:
import org.springframework.cloud.gateway.support.NotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
public class CustomErrorWebExceptionHandler extends DefaultErrorWebExceptionHandler {
public CustomErrorWebExceptionHandler(ObjectProvider<List<ErrorWebExceptionHandler>> errorWebExceptionHandlers,
ServerCodecConfigurer serverCodecConfigurer,
ResourceProperties resourceProperties,
ApplicationContext applicationContext) {
super(errorWebExceptionHandlers, resourceProperties, serverCodecConfigurer, applicationContext);
}
@Override
public Mono<ServerResponse> handle(ServerWebExchange exchange, Throwable error) {
String userId = extractUserId(exchange); // 从请求中提取用户 ID
int code;
String message;
if (error instanceof DecryptException) {
code = CodeEnum.CODE224.getCode();
message = CodeEnum.CODE2.getMessage();
} else if (error instanceof NotFoundException) {
code = HttpStatus.NOT_FOUND.value();
message = CodeEnum.CODE2.getMessage();
} else if (error instanceof ParanErrorException) {
code = CodeEnum.CODE216.getCode();
message = error.getMessage();
} else if (error instanceof NotLoginException) {
code = CodeEnum.CODE20.getCode();
message = CodeEnum.CODE20.getMessage();
} else if (error instanceof BekickedException) {
code = CodeEnum.CODE_PASSWORD_22.getCode();
message = error.getMessage();
} else if (error instanceof BigDataException) {
code = CodeEnum.CODE2.getCode();
message = CodeEnum.CODE2.getMessage();
} else if (error instanceof BusinessException) {
BusinessException e = (BusinessException) error;
code = e.getCode() != null ? e.getCode() : CodeEnum.DEFAULT_CODE.getCode();
message = e.getMessage();
} else {
code = HttpStatus.INTERNAL_SERVER_ERROR.value();
message = "Internal Server Error";
}
// 记录日志,包含用户 ID
logError(error, userId);
return response(code, message, userId);
}
private String extractUserId(ServerWebExchange exchange) {
// 从请求中提取用户 ID,可能是从请求头、请求参数或会话中获取
return exchange.getRequest().getHeaders().getFirst("User-ID");
}
private Mono<ServerResponse> response(int code, String message, String userId) {
// 构建响应体,包含用户 ID
Map<String, Object> responseBody = new HashMap<>();
responseBody.put("code", code);
responseBody.put("message", message);
responseBody.put("userId", userId); // 将用户 ID 加入响应
return ServerResponse.status(code)
.bodyValue(responseBody);
}
private void logError(Throwable error, String userId) {
// 记录错误日志,包含用户 ID
// 这里可以使用日志框架记录错误信息
System.err.println("Error occurred for user: " + userId + ", message: " + error.getMessage());
}
}
在 extractUserId
方法中,你可以根据你的应用逻辑从请求中提取用户 ID。可以从请求头、请求参数或会话中获取。
在 logError
方法中,你可以记录错误信息,并包含用户 ID,以便后续排查问题。
在 response
方法中,构建响应体时将用户 ID 加入到响应中。
通过以上步骤,你可以在自定义的 DefaultErrorWebExceptionHandler
中统一处理异常,并将用户 ID 等自定义属性加入到响应中。这将有助于更好地管理和排查异常情况。如果你有其他具体需求或问题,请随时询问!