You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前端连接WebSocket成功但无法触发后端STOMP端点方法求助

问题排查与解决方案

1. 后端@MessageMapping路径配置错误

你的WebSocket配置中已设置registry.setApplicationDestinationPrefixes("/app"),这意味着所有发送到后端应用端点的消息会自动带上/app前缀。但控制器的@MessageMapping里重复写了/app前缀,导致实际目标路径变为/app/app/sendMessage/{id}/{chatId},前端无法匹配到正确端点。

修改控制器代码:

// 移除@MessageMapping中的/app前缀
@MessageMapping("/sendMessage/{id}/{chatId}")
@SendTo("/topic/chat/{chatId}")
public Chat saveMessage(@RequestHeader("auth-token") String authToken, @PathVariable String chatId, @PathVariable String id, @RequestBody Chat chat){
    return sendMessage(authToken, chatId, id, chat);
}

2. 前端缺少发送消息的核心逻辑

你提供的前端代码仅完成了WebSocket连接和空订阅,没有实际发送消息到后端端点的逻辑,这是控制器方法未触发的直接原因。需添加发送逻辑,正确传递路径变量、请求头和消息体。

添加前端发送消息方法:

// 需确保stompClient已在state中可用
const sendChatMessage = (id, chatId, authToken, chatContent) => {
  if (!stompClient) return;
  
  // 构造目标路径,替换路径变量
  const destination = `/app/sendMessage/${id}/${chatId}`;
  // 构造符合Chat实体结构的消息体
  const chat = { content: chatContent /* 根据实际实体补充其他字段 */ };
  
  // 发送消息并携带auth-token请求头
  stompClient.publish({
    destination: destination,
    body: JSON.stringify(chat),
    headers: {
      'auth-token': authToken
    }
  });
};

3. 前端订阅路径为空,无法接收推送消息

前端订阅代码中的目标路径是空字符串,需替换为正确的订阅路径/topic/chat/{chatId}(将{chatId}替换为实际聊天ID)。

修正订阅代码:

// 假设chatId为已知变量
const subscription = stomp.subscribe(`/topic/chat/${chatId}`, (message) => {
  const chat = JSON.parse(message.body);
  setPreviousMessages((prevMessage) => [...prevMessage, chat]);
});

验证步骤

  1. 重启后端服务,确保修改后的控制器代码生效。
  2. 前端连接WebSocket后,调用sendChatMessage方法,传入正确的id、chatId、authToken和消息内容。
  3. 查看后端控制台是否打印Hello,若打印则说明控制器方法已触发。

内容的提问来源于stack exchange,提问作者Heni Mehta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:34:55