From 250ea10787d734d7e8d03639787e8d7b563b6ead Mon Sep 17 00:00:00 2001 From: octo-patch Date: Tue, 28 Apr 2026 10:49:56 +0800 Subject: [PATCH] fix: store RestAI messages as List in cache to prevent ClassCastException (fixes #1796, #1812) chatWithRestAi was storing messages as a JSON string via JSONUtil.toJsonStr() but getFastChatMessage() cast the cached value directly to List. On the second consecutive request the cast threw a ClassCastException causing a 500 error. Fix: store the List object directly, consistent with other AI providers. Also add instanceof guard in getFastChatMessage for defensive type safety. Co-Authored-By: Octopus --- .../chat2db/server/web/api/controller/ai/ChatController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/ai/ChatController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/ai/ChatController.java index 8010a1258..d5084be56 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/ai/ChatController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/ai/ChatController.java @@ -269,7 +269,7 @@ private SseEmitter chatWithRestAi(ChatQueryRequest queryRequest, SseEmitter sseE RestAIEventSourceListener restAIEventSourceListener = new RestAIEventSourceListener(sseEmitter); RestAIClient.getInstance().streamCompletions(messages, restAIEventSourceListener); - LocalCache.CACHE.put(uid, JSONUtil.toJsonStr(messages), LocalCache.TIMEOUT); + LocalCache.CACHE.put(uid, messages, LocalCache.TIMEOUT); return sseEmitter; } @@ -462,7 +462,8 @@ private SseEmitter chatWithBaichuanAi(ChatQueryRequest queryRequest, SseEmitter * @return */ private List getFastChatMessage(String uid, String prompt) { - List messages = (List)LocalCache.CACHE.get(uid); + Object cached = LocalCache.CACHE.get(uid); + List messages = (cached instanceof List) ? (List) cached : null; if (CollectionUtils.isNotEmpty(messages)) { if (messages.size() >= contextLength) { messages = messages.subList(1, contextLength);