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

Spring WebSocket无法接收React前端发送的消息问题排查

Spring WebSocket + React 消息无响应问题排查与修复

以下是导致消息无响应的核心问题及修复方案:


1. React端路径配置错误

问题点:

  • 发送消息时使用了完整域名路径http://localhost:8080/hello,但Spring配置了setApplicationDestinationPrefixes("/app"),所有指向控制器的消息必须以/app为前缀。
  • 订阅通道时同样添加了完整域名,Stomp客户端订阅应使用相对Broker的路径,无需重复携带域名。

修复后的App.js:

import './index.css';
import SockJS from "sockjs-client"
import Stomp from 'stompjs'
import React from "react";

function App() {
  let stompClient;

  const connect = () => {
    const socket = new SockJS("http://localhost:8080/simulator");
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
      console.log("Connected " + frame);
      // 修正订阅路径,仅保留Broker通道路径
      stompClient.subscribe("/endpoint/greeting", function (greeting) {
        console.log("收到消息: ", JSON.parse(greeting.body));
      });
    });
  };

  const sendSomething = () => {
    // 修正发送路径,添加/app前缀匹配Spring配置
    stompClient.send("/app/hello", {}, JSON.stringify({"name":"John"}));
  };

  return (
    <>
      <button onClick={connect}>Connect</button>
      <button onClick={sendSomething}>Send</button>
    </>
  );
}

export default App;

2. Message类缺少无参构造函数

问题点:

Spring在反序列化JSON到Message对象时,默认需要无参构造函数完成实例化,当前类仅提供带参构造函数,导致请求体无法解析,消息无法到达控制器方法。

修复后的Message.java:

public class Message {
    private String name;

    // 添加无参构造函数
    public Message() {}

    public Message(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. 控制器返回类型错误

问题点:

@SendTo注解用于直接返回广播的消息内容,无需用ResponseEntity包装——该类是HTTP响应专用结构,会导致Stomp消息序列化异常,无法正确发送到订阅通道。

修复后的MessageController.java:

@Controller
public class MessageController {

    @MessageMapping("/hello")
    @SendTo("/endpoint/greeting")
    public JsonObject getContent(@RequestBody Message message) {
        JsonObject jo = new JsonObject();
        jo.put("isLiked", "Yes");
        System.out.println("here");
        System.out.println(message.getName());
        // 直接返回消息对象
        return jo;
    }
}

内容的提问来源于stack exchange,提问作者Павел Выдыш

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:58:07