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
相关产品推荐
相关产品推荐

