使用WebSocket进行依赖注入为null的解决办法

使用WebSocket进行依赖注入为null的解决办法

最近需要整合Websocket,@ServerEndpoint注解所标注的类,类似于我们写的@Controller标注的Controller层,
结果@Autowire注入的Service层的bean为null,然后检查配置,各种姿势测试这个bean,发现和
@ServerEndpoint有关。先看代码

@ServerEndpoint(value="/websocket/{userId}")
public class WebSocket {

    private static int onlineCount = 0;
    private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
    private Session session;
    private String userId;

	这里使用注解@Autowired@Resource 注入结果都为null
    private UsersServerImpl usersServerimpl;


    @OnOpen
    public void onOpen(@PathParam("userId") String userId, Session session) throws IOException {

你要用 @ServerEndpoint实现ws,就注定不能用@Autowired注入bean,那咋整?new一个?肯定不行。思来想去,你不就是要个bean么,我@Autowired把你召唤不出来,那我拿spring上下文把你getBean(“name”)一下如何,注解用不了咱原生走一波。

	ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-dao.xml");

	UsersServiceImpl usersServiceImpl=(UsersServiceImpl)context.getBean("usersServiceImpl");

	Push push = usersServiceImpl.selectPushByName(studentid);

那么问题又来了,容器启动的时候spring上下文已经加载了,怎样拿到这个上下文?参考解释

拿到上下文就好说了,直接getBean就OK。

 @OnClose
    public void onClose(){
        System.out.println("连接:{} 关闭"+this.userId);
        
        if(this.usersServerimpl == null){
            this.usersServerimpl=(UsersServerImpl) SpringContextUtil.getBean("usersServerImpl");
            Integer integer = usersServerimpl.signOut(Integer.parseInt(this.userId));
        }

        System.out.println("执行结束");
        removeOnlineCount();
    }

好了,这个问题目前来说看起来很好的解决了
这里使用到的SpringContextUtil是一个工具类 代码奉上

package com.spz.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 获取spring中的bean对象工具类
 * @date 2018-07-23 17:42
 */
@Component
public class SpringContextUtil  implements ApplicationContextAware {

    /**
     *  Spring应用上下文环境
     */
    private static ApplicationContext applicationContext;


    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取对象 这里重写了bean方法,起主要作用
     */
    public static Object getBean(String beanId) throws BeansException {
        return applicationContext.getBean(beanId);
    }
}

个人博客【技术宋

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用Spring Boot和WebSocket的示例代码: 1. 首先,在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建一个WebSocket配置类: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myWebSocketHandler(), "/my-websocket-endpoint").setAllowedOrigins("*"); } @Bean public WebSocketHandler myWebSocketHandler() { return new MyWebSocketHandler(); } } ``` 3. 创建一个WebSocket处理程序: ``` public class MyWebSocketHandler implements WebSocketHandler { private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { sessions.remove(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } } ``` 4. 在控制器中注入WebSocketHandler: ``` @RestController public class MyController { @Autowired private WebSocketHandler myWebSocketHandler; @GetMapping("/send-message") public void sendMessage(@RequestParam String message) { TextMessage textMessage = new TextMessage(message); try { myWebSocketHandler.handleMessage(null, textMessage); } catch (Exception e) { e.printStackTrace(); } } } ``` 5. 在前端页面中使用JavaScript连接WebSocket: ``` var socket = new WebSocket('ws://localhost:8080/my-websocket-endpoint'); socket.onopen = function() { console.log('WebSocket opened'); }; socket.onmessage = function(event) { console.log('WebSocket message received: ' + event.data); }; socket.onclose = function(event) { console.log('WebSocket closed with code: ' + event.code); }; socket.onerror = function(event) { console.log('WebSocket error: ' + event.error); }; ``` 这是一个简单的示例,您可以根据自己的需求进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值