ssm集成websocket扫码沙箱支付回调
我是基于这一篇博客springboot集成websocket来搞的,奈何能碰上的bug基本都碰上了,
bug展览
下面为完整的测试通过的代码。
1.引入依赖(不加这个scope会报Caused by: java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer)
<!--websocket配置--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>${spring.version}</version> </dependency> <!-- scope注意一下--> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> <scope>provided</scope> </dependency>
2.websocket配置类(注意,将ServerEndpointExporter注掉,否则会报Caused by: javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/bindingRecord],因为tomcat本身已经集成了,会冲突)
@Component @ServerEndpoint("/bindingRecord") @Slf4j public class WebSocket { private Session session; private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>(); /** * 新建webSocket配置类 * @return */ // @Bean // public ServerEndpointExporter serverEndpointExporter() { // return new ServerEndpointExporter(); // } /** * 建立连接 * @param session */ @OnOpen public void onOpen(Session session) { this.session = session; webSockets.add(this); log.info("【新建连接】,连接总数:{}", webSockets.size()); } /** * 断开连接 */ @OnClose public void onClose(){ webSockets.remove(this); log.info("【断开连接】,连接总数:{}", webSockets.size()); } /** * 接收到信息 * @param message */ @OnMessage public void onMessage(String message){ log.info("【收到】,客户端的信息:{},连接总数:{}", message, webSockets.size()); } /** * 发送消息 * @param message */ public void sendMessage(String message){ log.info("【广播发送】,信息:{},总连接数:{}", message, webSockets.size()); for (WebSocket webSocket : webSockets) { try { webSocket.session.getBasicRemote().sendText(message); } catch (IOException e) { log.info("【广播发送】,信息异常:{}", e.fillInStackTrace()); } } } }
3.vue前端
this.$http .post("http://localhost:8989/pay/alipay", this.cart) .then((res) => { console.log(res) console.log(res.data) if (res.status === 200) { _this.text = res.data _this.dialogVisible = true; //使用websocket发送请求 if ("WebSocket" in window) { //打开一个web socket var ws = new WebSocket("ws://localhost:8989/bindingRecord") ws.onopen = function () { ws.send("客户端向8989端口发送请求...") } ws.onmessage = function (evt) { var recevied_msg = evt.data console.log(recevied_msg) if (Boolean(recevied_msg)) { _this.paySucc = true; setTimeout(() => { _this.dialogVisible = false;//支付弹窗关闭 }, 3 * 1000) } ws.close() } ws.onclose = function () { console.log("连接已经关闭") } } else { alert("您的浏览器不支持websocket!") } } }).catch((err) => { console.log(err) });
还有,中途碰到前端连接不上的问题,WebSocket connection to 'ws://localhost:8989/bindingRecord' failed。
如图所示,
查了很多博客,都是说前端代码的问题,但是实际上,很可能是后端他没有接收到人家的请求,没有响应。是后端代码写的有问题,我把依赖中scope那行加上之后(记得刷新maven),就没有这个错误了,具体原理我其实并不是很清楚。可参见这两篇博客,Tomcat 8 和网络套接字 DeploymentException
前端:
后端:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!