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,提问作者Павел Выдыш
相关产品推荐
相关产品推荐

