hezonglin1983 2024-08-28 21:02 采纳率: 84.8%
浏览 6

如何在DefaultErrorWebExceptionHandler里加入自定义的属性

我自定义了一个DefaultErrorWebExceptionHandler,用来统一捕获异常

img


请问一下,如果我如何把自定义的属性比如用户id加入到这个类里面进行统一处理呢?

  • 写回答

1条回答 默认 最新

  • 清水白石008 2024-08-28 21:13
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“最伟大的荣耀不在于从不跌倒,而在于每次跌倒后都能站起来。” — 纳尔逊·曼德拉
    

    要在自定义的 DefaultErrorWebExceptionHandler 中统一处理异常并将用户 ID 等自定义属性加入到响应中,你可以按照以下步骤进行:

    1. 自定义异常类

    首先,确保你有一个自定义异常类,能够携带用户 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;
        }
    }
    

    2. 修改 DefaultErrorWebExceptionHandler

    在你的 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());
        }
    }
    

    3. 提取用户 ID

    extractUserId 方法中,你可以根据你的应用逻辑从请求中提取用户 ID。可以从请求头、请求参数或会话中获取。

    4. 记录日志

    logError 方法中,你可以记录错误信息,并包含用户 ID,以便后续排查问题。

    5. 响应构建

    response 方法中,构建响应体时将用户 ID 加入到响应中。

    总结

    通过以上步骤,你可以在自定义的 DefaultErrorWebExceptionHandler 中统一处理异常,并将用户 ID 等自定义属性加入到响应中。这将有助于更好地管理和排查异常情况。如果你有其他具体需求或问题,请随时询问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月28日

悬赏问题

  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏