From 6bf64449bd14d776405378cf01a7928b2e12fd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=80=AA=E7=A8=8B=E4=BC=9F?= Date: Fri, 22 May 2026 16:10:05 +0800 Subject: [PATCH] fix(channel/feishu): register all IM event handlers to prevent HandlerNotFoundException (#196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Lark SDK throws HandlerNotFoundException for any event type without a registered handler. This exception is caught internally by the SDK's WebSocket client, which then sends a 500 response to the Feishu server. The server may close the connection as a result, and the exception is swallowed — never reaching the application layer. Added empty handlers for all remaining IM event types: - P2MessageReadV1 (read receipts) - P2MessageRecalledV1 (message recall) - P2ChatMemberBotDeletedV1 (bot removed from chat) - P2ChatMemberUserAddedV1 / UserDeletedV1 / UserWithdrawnV1 - P2ChatUpdatedV1 (chat info update) - P2ChatDisbandedV1 (chat disbanded) - P2ChatAccessEventBotP2pChatEnteredV1 (bot entered p2p chat) Also added explicit logback config for com.lark.oapi at WARN level to ensure SDK internal errors are not silently filtered. Refs: larksuite/oapi-sdk-java#185 --- .../channel/feishu/FeishuChannelAdapter.java | 43 ++++++++++++++++++- .../src/main/resources/logback-spring.xml | 3 ++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/mateclaw-server/src/main/java/vip/mate/channel/feishu/FeishuChannelAdapter.java b/mateclaw-server/src/main/java/vip/mate/channel/feishu/FeishuChannelAdapter.java index 9d55ce25..30dd6ff2 100644 --- a/mateclaw-server/src/main/java/vip/mate/channel/feishu/FeishuChannelAdapter.java +++ b/mateclaw-server/src/main/java/vip/mate/channel/feishu/FeishuChannelAdapter.java @@ -377,7 +377,11 @@ public class FeishuChannelAdapter extends AbstractChannelAdapter implements Stre } } }) - // Silently ignore message reaction events to avoid HandlerNotFoundException + // Silently ignore all other IM events to avoid HandlerNotFoundException. + // When the SDK receives an event without a registered handler, it throws + // HandlerNotFoundException → SDK catches it and sends a 500 response → + // the Feishu server may close the WebSocket connection. The exception is + // swallowed inside the SDK so it never appears in application logs. .onP2MessageReactionCreatedV1(new ImService.P2MessageReactionCreatedV1Handler() { @Override public void handle(com.lark.oapi.service.im.v1.model.P2MessageReactionCreatedV1 event) {} @@ -386,11 +390,46 @@ public class FeishuChannelAdapter extends AbstractChannelAdapter implements Stre @Override public void handle(com.lark.oapi.service.im.v1.model.P2MessageReactionDeletedV1 event) {} }) - // Silently ignore bot added to chat event to avoid HandlerNotFoundException (#153) + .onP2MessageReadV1(new ImService.P2MessageReadV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2MessageReadV1 event) {} + }) + .onP2MessageRecalledV1(new ImService.P2MessageRecalledV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2MessageRecalledV1 event) {} + }) .onP2ChatMemberBotAddedV1(new ImService.P2ChatMemberBotAddedV1Handler() { @Override public void handle(com.lark.oapi.service.im.v1.model.P2ChatMemberBotAddedV1 event) {} }) + .onP2ChatMemberBotDeletedV1(new ImService.P2ChatMemberBotDeletedV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatMemberBotDeletedV1 event) {} + }) + .onP2ChatMemberUserAddedV1(new ImService.P2ChatMemberUserAddedV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatMemberUserAddedV1 event) {} + }) + .onP2ChatMemberUserDeletedV1(new ImService.P2ChatMemberUserDeletedV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatMemberUserDeletedV1 event) {} + }) + .onP2ChatMemberUserWithdrawnV1(new ImService.P2ChatMemberUserWithdrawnV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatMemberUserWithdrawnV1 event) {} + }) + .onP2ChatUpdatedV1(new ImService.P2ChatUpdatedV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatUpdatedV1 event) {} + }) + .onP2ChatDisbandedV1(new ImService.P2ChatDisbandedV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatDisbandedV1 event) {} + }) + .onP2ChatAccessEventBotP2pChatEnteredV1(new ImService.P2ChatAccessEventBotP2pChatEnteredV1Handler() { + @Override + public void handle(com.lark.oapi.service.im.v1.model.P2ChatAccessEventBotP2pChatEnteredV1 event) {} + }) // Interactive card button clicks (Schema 2.0) — routed through cardDispatcher. // The returned P2CardActionTriggerResponse is how Schema-2.0 // cards update in-place; PATCH /im/v1/messages/{id} is a diff --git a/mateclaw-server/src/main/resources/logback-spring.xml b/mateclaw-server/src/main/resources/logback-spring.xml index 6922ce98..9710add5 100644 --- a/mateclaw-server/src/main/resources/logback-spring.xml +++ b/mateclaw-server/src/main/resources/logback-spring.xml @@ -114,6 +114,9 @@ + + +