Spring中STOMP通知无法在控制台输出消息求助
你遇到的核心问题是WebSocket连接成功但收不到STOMP消息,下面是针对性的修复步骤:
1. 修复前端STOMP连接方式
后端配置了withSockJS(),意味着需要通过SockJS协议连接,而非直接用WebSocket协议。修改前端代码:
原前端连接代码:
let url = ('ws://localhost:8080/ws/websocket') console.log(url) stompClient = Stomp.client(url)
替换为:
const socket = new SockJS('http://localhost:8080/ws'); stompClient = Stomp.over(socket); stompClient.connect({}, function () { console.log('Connected to STOMP server'); stompClient.subscribe('/all/messages', function (output) { // 后端当前发送的是字符串,无需JSON.parse console.log(output.body); }); }, function (err) { alert('Error connecting: ' + err); });
说明:Stomp.over(socket)会基于SockJS创建STOMP客户端,匹配后端的SockJS端点配置。
2. 修正控制器注解与返回值
@MessageMapping是处理STOMP消息的注解,不需要结合@RestController(这会把返回值作为HTTP响应),改用@Controller,并且不需要返回ResponseEntity:
原控制器代码:
@RestController public class MessageController { @Autowired private MessageService messageService; @MessageMapping("/message") // @SendTo("/all/messages") public ResponseEntity<MessageResponse> sendMessageToAll(@RequestBody MessageRequest request) { return ResponseEntity.ok(messageService.sendMessageToAll(request.getMessage())); } }
替换为:
@Controller public class MessageController { @Autowired private MessageService messageService; @MessageMapping("/message") public void sendMessageToAll(@RequestBody MessageRequest request) { messageService.sendMessageToAll(request.getMessage()); } @MessageMapping("/message-user") public void sendMessageToUser(@RequestBody MessageRequest request) { messageService.sendMessageToUser(request.getUser(), request.getMessage()); } }
说明:@MessageMapping方法的作用是接收STOMP客户端发送的消息,消息推送由SimpMessagingTemplate完成,不需要返回HTTP响应。
3. 前端添加触发消息的逻辑
你当前的前端只做了订阅,没有发送消息触发后端的推送逻辑。添加一个按钮和发送函数:
在HTML的<body>里加:
<button onclick="sendTestMessage()">Send Test Broadcast</button>
在JS里添加函数:
function sendTestMessage() { // 发送消息到后端配置的/app前缀 + @MessageMapping的路径 stompClient.send("/app/message", {}, JSON.stringify({message: "Test broadcast message"})); }
说明:后端配置了setApplicationDestinationPrefixes("/app"),所以STOMP客户端发送消息的目的地需要是/app/message,才能匹配@MessageMapping("/message")的方法。
4. 修复响应类的序列化问题
你的MessageResponse类没有getter方法,Spring在序列化对象时会失败(如果后续需要推送MessageResponse而非字符串),添加getter/setter:
public class MessageResponse{ private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
或者用Lombok注解简化:
@Getter @Setter public class MessageResponse{ private String message; }
验证步骤
- 启动后端服务
- 打开测试HTML页面,确认控制台输出
Connected to STOMP server - 点击
Send Test Broadcast按钮 - 查看控制台,应该会打印后端推送的
meessaaaa
内容的提问来源于stack exchange,提问作者Mustn

