Spring Boot中用Postman连接WebSocket遇404错误求助
问题描述
我是Java和WebSocket新手,跟着教程写了Spring Boot WebSocket代码,想用Postman验证功能是否正常。请求地址是ws://localhost:8080/cat,期望触发Controller的/cat端点,但一直返回404错误。以下是我的代码和错误详情:
ChatController代码
@Controller public class ChatController { @MessageMapping("/cat") @SendTo("/topic/public") public ChatMessage hatResponse(@Payload final ChatMessage chat) { System.out.println("hat"); return chat; } }
WebSocketConfig代码
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/cat"); // 这里不是应该暴露"cat"端点吗? registry.addEndpoint("/cat").withSockJS(); } }
错误详情
Error: Unexpected server response: 404 Handshake Details Request URL: http://localhost:8080/cat Request Method: GET Status Code: 404 Request Headers Sec-WebSocket-Version: 13 Sec-WebSocket-Key: uwNdTzo+d0HSl70zn1OajA== Connection: Upgrade Upgrade: websocket Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Host: localhost:8080 Response Headers Vary 0: Origin 1: Access-Control-Request-Method 2: Access-Control-Request-Headers Content-Type: application/json Transfer-Encoding: chunked Date: Tue, 04 Apr 2023 01:45:34 GMT
问题排查与解决方案
核心原因
你的配置和请求存在两个关键问题:
- 端点注册重复:重复添加
/cat端点可能导致Spring Boot路径匹配异常; - 概念混淆:
registerStompEndpoints中的/cat是WebSocket握手端点,用于建立连接;而@MessageMapping("/cat")是STOMP消息目的地,必须结合配置的/app前缀使用,不能直接通过握手路径触发。
修复步骤
清理重复的端点注册
修改WebSocketConfig的registerStompEndpoints方法,保留一个端点注册即可:@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/cat").withSockJS(); // 统一注册带SockJS兼容的端点 }正确使用Postman测试
- 建立WebSocket连接:在Postman创建WebSocket请求,地址填写
ws://localhost:8080/cat,点击"Connect",确认连接成功; - 发送STOMP消息:切换到"Message"标签,选择
STOMP类型,在"Destination"中填写/app/cat,消息体传入符合ChatMessage结构的JSON(例如{"content":"test","sender":"me"}),发送后即可触发ChatController的方法,同时会收到/topic/public返回的消息。
- 建立WebSocket连接:在Postman创建WebSocket请求,地址填写
检查拦截规则
如果项目中有Spring Security或自定义拦截器,需要确保/cat路径被放行,允许WebSocket握手请求通过。
额外说明
@MessageMapping的路径是消息路由地址,必须加上setApplicationDestinationPrefixes配置的/app前缀才能被正确路由;- SockJS用于兼容低版本浏览器,若仅测试原生WebSocket,可去掉
withSockJS(),Postman支持原生WebSocket连接。
内容的提问来源于stack exchange,提问作者plutownium
相关产品推荐
相关产品推荐

