问题描述
当 WebSocket 长连接收到未在 EventDispatcher 中注册 handler 的事件类型时,SDK 抛出 HandlerNotFoundException。该异常在 ws.Client.handleDataFrame 中被内部 catch,SDK 发送 500 响应给飞书服务端,可能导致服务端主动断开 WebSocket 连接。
关键问题:异常在 SDK 内部被吞掉,应用层无法感知,且 SDK 没有提供 fallback handler 机制来让外部代码处理未注册的事件。
复现路径
- 使用 WebSocket 长连接模式
EventDispatcher 只注册部分 IM 事件的 handler(如 P2MessageReceiveV1)
- 飞书服务端推送未注册的事件(如
im.message.read_v1、im.chat.member.bot.deleted_v1 等)
- SDK 抛出
HandlerNotFoundException → catch → 发送 500 → 连接可能断开
期望行为
EventDispatcher.Builder 提供 fallback handler 机制(如 .onUnhandledEvent(handler)),让外部代码可以统一处理未注册的事件类型
- 或者未注册的事件类型被静默忽略(返回 200),而非抛异常导致 500 响应
当前版本
oapi-sdk: 2.6.1
当前 workaround
在 EventDispatcher.Builder 上为所有可能的事件类型注册空 handler,但这需要手动维护,且无法覆盖 SDK 未来新增的事件类型。
// 需要手动注册所有已知事件的空 handler
EventDispatcher.newBuilder("", "")
.onP2MessageReceiveV1(handler)
.onP2MessageReactionCreatedV1(event -> {})
.onP2MessageReactionDeletedV1(event -> {})
.onP2MessageReadV1(event -> {})
.onP2MessageRecalledV1(event -> {})
.onP2ChatMemberBotAddedV1(event -> {})
.onP2ChatMemberBotDeletedV1(event -> {})
// ... 还有更多
.build();
问题描述
当 WebSocket 长连接收到未在
EventDispatcher中注册 handler 的事件类型时,SDK 抛出HandlerNotFoundException。该异常在ws.Client.handleDataFrame中被内部 catch,SDK 发送 500 响应给飞书服务端,可能导致服务端主动断开 WebSocket 连接。关键问题:异常在 SDK 内部被吞掉,应用层无法感知,且 SDK 没有提供 fallback handler 机制来让外部代码处理未注册的事件。
复现路径
EventDispatcher只注册部分 IM 事件的 handler(如P2MessageReceiveV1)im.message.read_v1、im.chat.member.bot.deleted_v1等)HandlerNotFoundException→ catch → 发送 500 → 连接可能断开期望行为
EventDispatcher.Builder提供 fallback handler 机制(如.onUnhandledEvent(handler)),让外部代码可以统一处理未注册的事件类型当前版本
oapi-sdk: 2.6.1
当前 workaround
在
EventDispatcher.Builder上为所有可能的事件类型注册空 handler,但这需要手动维护,且无法覆盖 SDK 未来新增的事件类型。