zoukankan      html  css  js  c++  java
  • Spring boot WebSocket 注入失败

    1.在@ServerEndpoint()下面添加

        //此处是解决无法注入的关键
        private static ApplicationContext applicationContext;
        //这里是service
        private WebSocketService webSocketService;

    2.继续添加

    public static void setApplicationContext(ApplicationContext context) {
            applicationContext = context;
        }

    3.使用方法

    webSocketService=applicationContext.getBean(WebSocketService.class);
            webSocketService.setUserStatus(1L,"online");

    4.完整代码

    package com.xbjs.webim.controller;
    
    
    import java.io.IOException;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    
    import com.xbjs.webim.service.WebSocketService;
    import com.xbjs.webim.service.serviceimpl.WebSocketServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.stereotype.Component;
    import org.springframework.web.socket.server.standard.SpringConfigurator;
    
    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    
    
    /**
     * Created with IntelliJ IDEA.
     *
     * @author: xincheng.zhao
     * @date: 2018/9/4
     * @description:
     */
    
    @ServerEndpoint(value = "/websocket/{userId}")
    @Component
    public class WSController {
    
        //concurrent包的线程安全Map,用来存放每个客户端对应的MyWebSocket对象。
        private static Map<Long, WSController> webSocketmap = new ConcurrentHashMap<Long, WSController>();
    
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
    
        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
        private static int onlineUser;
    
        //此处是解决无法注入的
        private static ApplicationContext applicationContext;
    
        private WebSocketService webSocketService;
    
        //当前用户id
        private Long userId;
    
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(@PathParam("userId") Long userId, Session session) {
            onlineUser++;
            this.session = session;
            this.userId = userId;
            //把自己的信息加入map
            webSocketmap.put(userId, this);
            System.out.println("有新连接加入!当前在线人数为:" + onlineUser);
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            onlineUser--;
            System.out.println("websocket close");
        }
    
        /*
         *收到客户端消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            System.out.println("收到客户端消息:" + message);
            webSocketService=applicationContext.getBean(WebSocketService.class);
            webSocketService.setUserStatus(1L,"online");
            sendMessageTo("你好", 1L);
        }
    
        //    /*
    //     *服务端发生异常
    //     */
    //    @OnError
    //    public void onError(Session session, Throwable throwable) {
    //        System.out.println("服务端发生异常");
    //    }
        //发送消息
        public void sendMessageTo(String message, Long userId) {
            for (WSController item : webSocketmap.values()) {
                if (item.userId.equals(userId)) {
                    item.session.getAsyncRemote().sendText(message);
                }
            }
        }
    
        //向所有在线用户通知
        public void sendMessageAll(String message, String FromUserName) throws IOException {
            for (WSController item : webSocketmap.values()) {
                item.session.getAsyncRemote().sendText(message);
            }
        }
    
    
        public static synchronized int getOnlineUser() {
            return onlineUser;
        }
    
        public static void setApplicationContext(ApplicationContext context) {
            applicationContext = context;
        }
    
    }
    小白技术社
  • 相关阅读:
    【题解】国家集训队礼物(Lucas定理)
    【题解】佳佳的斐波那契数列(矩阵)
    【题解】Zap(莫比乌斯反演)
    HNOI2019爆零记
    Emacs配置
    【题解】Journeys(线段树优化连边)
    一直没有敢发的NOIP2018游记
    【题解】Digit Tree
    【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
    【题解】大括号
  • 原文地址:https://www.cnblogs.com/xbjss/p/13326704.html
Copyright © 2011-2022 走看看