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

Spring WebSockets中STOMP发送正常但@MessageMapping未被调用

Spring STOMP @MessageMapping 方法未触发排查方案

核心问题根因(90%概率是这个)

你的Message实体类缺少无参构造函数。
Spring默认用Jackson做JSON消息反序列化,把前端传过来的JSON字符串转成Message对象时,必须要求实体类存在公开的无参构造器。你当前代码里只定义了带name、content参数的全参构造,Java虚拟机不会自动生成默认无参构造,反序列化阶段直接失败,消息不会流转到控制器方法,且默认日志级别下通常不会打印显眼的报错,只会表现为前端显示消息发送成功、后端方法无任何响应。
修复方式:直接在Message类里补一个无参构造即可:

// 新增无参构造
public Message() {}

其他需要逐一验证的排查点

  • 前端STOMP连接未真正建立就发送消息
    SockJS连接端点必须和后端配置一致,即连接/server1路径,且所有发送、订阅操作必须放在connect的成功回调里执行,连接未完成时调用send()不会真的把消息发到后端,只是存在客户端本地队列。正确连接示例:
    const stompClient = Stomp.over(new SockJS('/server1'));
    stompClient.connect({}, (frame) => {
      console.log('STOMP连接成功', frame);
      // 在这里绑定发送按钮事件、执行订阅操作
    });
    
  • 控制器未被Spring扫描注册
    检查启动类、Config配置类、MessageControl控制器是否在同一包/子包路径下,Spring没扫到控制器的话根本不会注册/message的消息映射。启动服务时可以搜索日志中是否存在Mapped "{[/message]}"相关的映射注册记录,没有这条记录就说明控制器未被加载。
  • 消息头未声明JSON类型
    发送消息时显式在头里声明内容类型为JSON,避免Spring找不到对应消息转换器:
    stompClient.send("/app/message", {'content-type': 'application/json'}, JSON.stringify(jsonOb));
    

额外说明

你配置类里的注释存在错误:registry.setApplicationDestinationPrefixes("/app")的作用是所有前缀为/app的目的地都会路由到@MessageMapping标注的控制器方法,不是注释写的"需要通过/app/topic发请求到broker",这个注释错误不影响代码运行,但是容易误导后续调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:16:30