IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> spring4.2.5+websocket+sockjs+stomp关于@MessageMapping注解的Controller类的方法不起作用的问题 -> 正文阅读

[网络协议]spring4.2.5+websocket+sockjs+stomp关于@MessageMapping注解的Controller类的方法不起作用的问题

想要在站点里弄个站点内部通讯的小功能,遇到一个很神奇的问题:

加了注解的@MessageMapping的Controller类的方法如:

@MessageMapping("/send/{id}")
@SendTo("/topic/{id}")
public MessageEntity sendMesage(@Payload MessageEntity message){

? ? ?return message;

}

但是前端使用 :

stompClient.send('/app/send/you',{},JSON.stringify({sender:'me',type:'E'}));

前端页面发送没异常,后台也没异常,就是请求不到 上述的Controller加了注解的方法上面。

上网搜索一圈是结果,发现有个国外站点的问题和我这个类似

链接:

Spring 4 WebSocket + sockJS:. Getting "No matching method found" in trace and @MessageMapping handler not invoked - Stack Overflow

其中有一个回答有点接近答案:

WebSocketConfig configuration class should be loaded as part of Servlet configuration, not Root configuration.

Make sure?WebSocketConfig.class?returned from your implementation of?AbstractAnnotationConfigDispatcherServletInitializer.getRootConfigClasses()

If you put it in root context, everything will work fine, you can use SimpMessagingTemplate, broker relay, but not @MessageMapping in controllers.

You can set breakpoint in?WebSocketAnnotationMethodMessageHandler.initControllerAdviceCache()?and check what beanss are loaded in context. If no?@Controller?marked bean in that method,?@MessageMapping?will not work.

这段话的意思是:

WebSocketConfig 配置类应该被当做Servlet配置加载,而不是 Root配置。请确保WebSocketConfig.class 从你的AbstractAnnotationConfigDispatcherServletInitializer.getRootConfigClasses()实现中返回。

你可以在WebSocketAnnotationMethodMessageHandler.initControllerAdviceCache()方法中设置断点查看上下文有哪些beans被加载,如果没有 @Controler标记的 bean 在方法里。@MessageMapping 将不会发挥作用。


但据我观察,我的这个类Controller是加载了的,而且其中的 一些action方法还可以执行。那问你可能就不是出在这个Controller没加载的问题。

难道是WebSocketConfig加载顺序有问题?我就按网上其他人的答案,重写 集成?AbstractAnnotationConfigDispatcherServletInitializer 这个类的方法。将WebSocketConfig.class 在 getServletConfigClasses 方法里返回。

然后测试后并没啥卵用。依旧是访问不到。


正在我要崩溃的时候,突然我想到了,加了注解@Controller类均被SpringMVC实例化加载的。他肯定不知道 @MessageMapping 注解是什么意思。而且这些消息通讯的动态接口要预先在WebSocket装配好才对呀。没装配的话,是不是WebSocketConfig在装配的时候,没有加载到这个Controller类,所以里面的加了注解 @MessageMapping的接口路径没有被注册上呢。

鬼使神差的在 WebSocketConfig配置类上加了 @CompanentScan(basePackageClasses="ChatController.class") 在上面:?

启动后,发现问你居然解决了。啊哈哈哈...这太扯淡了。

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章           查看所有文章
加:2021-10-19 12:16:09  更:2021-10-19 12:18:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 11:27:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码