Spring boot使用WebSocket是无法通过@Autowired注入bean问题解决

时间:2025-02-16 12:05:14
package ; import ; import ; import ; import org.; import org.; import ; import .Component; import .*; import .ServerEndpoint; import ; import ; /** * @PACKAGE_NAME: * @ClassName: MessageController * @ServerEndpoint(value = "/websocket", encoders = {},configurator = ) * @Description:消息 * @author: peiqiankun * @date: 2018-03-12 11:22 * @mail: peiqiankun@ * @version: v1.0 */ @ServerEndpoint(value = "/websocket", encoders = {ServerEncoder.class}) @Component public class MessageController { private final static Logger logger = LoggerFactory.getLogger(MessageController.class); //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 private static CopyOnWriteArraySet<MessageController> webSocketSet = new CopyOnWriteArraySet<MessageController>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; //此处是解决无法注入的关键 private static ApplicationContext applicationContext; //你要注入的service或者dao private CDSocketMessageService cdSocketMessageService; public static void setApplicationContext(ApplicationContext applicationContext) { MessageController.applicationContext = applicationContext; } /** * @Description:连接建立成功调用的方法 * @author: peiqiankun * @date: 2018/5/1 9:23 * @mail: peiqiankun@ */ @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线数加1 logger.info("有新连接加入!当前在线人数为-->{}", getOnlineCount()); try { //此处是解决无法注入的关键 cdSocketMessageService = applicationContext.getBean(CDSocketMessageService.class); CDSocketMessage cdSocketMessage = cdSocketMessageService.getPrompt(); sendMessage(cdSocketMessage); } catch (Exception e) { logger.error("IO异常-->{}", e); } } /** * @Description:连接关闭调用的方法 * @author: peiqiankun * @date: 2018/5/1 9:23 * @mail: peiqiankun@ */ @OnClose public void onClose() { webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 logger.info("有一连接关闭!当前在线人数为-->{}", getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { logger.info("来自客户端的消息-->{}", message); CDSocketMessage cdSocketMessage = new CDSocketMessage(); (message); //群发消息 for (MessageController item : webSocketSet) { try { (cdSocketMessage); } catch (IOException e) { (); } } } /** * @Description:发生错误 * @author: peiqiankun * @date: 2018/5/1 9:23 * @mail: peiqiankun@ */ @OnError public void onError(Session session, Throwable error) { logger.error("发生错误-->{}", ()); } public void sendMessage(CDSocketMessage message) throws IOException { try { this.session.getBasicRemote().sendObject(message); } catch (Exception e) { logger.error("发送消息异常-->", e); } } /** * @Description:群发自定义消息 * @author: peiqiankun * @date: 2018/5/1 9:24 * @mail: peiqiankun@ */ public static void sendInfo(CDSocketMessage message) throws IOException { for (MessageController item : webSocketSet) { try { (message); } catch (IOException e) { continue; } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { MessageController.onlineCount++; } public static synchronized void subOnlineCount() { MessageController.onlineCount--; } }