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

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;
}

验证步骤

  1. 启动后端服务
  2. 打开测试HTML页面,确认控制台输出Connected to STOMP server
  3. 点击Send Test Broadcast按钮
  4. 查看控制台,应该会打印后端推送的meessaaaa

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:42:23