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

