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

Spring Boot WebSocket(STOMP)消息接收函数失效问题排查

问题解决:STOMP WebSocket后端无法接收消息的修复方案

核心问题分析

  • @MessageMapping路径冗余:已通过setApplicationDestinationPrefixes("/app")指定了应用前缀,@MessageMapping无需重复添加/app,否则路径不匹配,导致消息无法路由到对应的处理方法。
  • 日志打印格式错误:logger.info("joined", chatMessageDTO);未使用占位符,无法正确输出参数内容,即使收到消息也看不到日志。

修正后的代码

WebSocket配置类(无需修改)

package com.lsm.backend.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("http://localhost:3000").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/queue", "/topic");

    }

}

修正后的ChatController

package com.lsm.backend.controller;

import com.lsm.backend.model.ChatMessageDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ChatController {
    @Autowired
    private SimpMessageSendingOperations messagingTemplate;
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // 移除@MessageMapping中的/app前缀
    @MessageMapping("/chatSendMessage")
    public void sendMessage(@Payload ChatMessageDTO chatMessageDTO) {
        logger.info("Received message from client: {}", chatMessageDTO);
        messagingTemplate.convertAndSend("/topic/public", chatMessageDTO);
    }

    // 移除@MessageMapping中的/app前缀,并修正日志占位符
    @MessageMapping("/chatAddUser")
    public void addUser(@Payload ChatMessageDTO chatMessageDTO) {
        logger.info("joined: {}", chatMessageDTO);
        messagingTemplate.convertAndSend("/topic/public", chatMessageDTO); 
    }
}

消息DTO类(无需修改)

package com.lsm.backend.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ChatMessageDTO {
    private MessageType type;
    private String content;
    private String sender;
    public enum MessageType{
        CHAT,
        JOIN,
        LEAVE
    }

}

额外检查点

  • 确认前端已正确订阅/topic/public目标地址,否则即使后端发送消息,前端也无法接收。
  • 验证前端发送的JSON结构与ChatMessageDTO完全匹配,确保反序列化正常(比如type字段值为JOIN/CHAT/LEAVE,大小写一致)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:32:13