websocket无法通过注解方式注入bean的解决办法

在做一个小程序聊天时,用java后台搭建,websocket无法通过springboot的注解注入bean

问题代码

在这里插入图片描述
报错

14:11:39.906 [http-nio-8181-exec-1] ERROR org.apache.tomcat.websocket.pojo.PojoEndpointBase - Failed to call onClose method of POJO end point for POJO of type [com.gdpu.middleware.websocket.ChatEndpoint]
java.lang.reflect.InvocationTargetException: null
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:107) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:767) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:715) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:665) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:652) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:646) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.handleOnOpenOrCloseError(PojoEndpointBase.java:96) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:81) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:48) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:136) [tomcat-embed-websocket-9.0.58.jar:9.0.58]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1735) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.58.jar:9.0.58]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.lang.NullPointerException
	at com.gdpu.middleware.websocket.ChatEndpoint.onClose(ChatEndpoint.java:166) ~[classes/:?]
	... 21 more
onError......
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:715)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:665)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:652)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:646)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.handleOnOpenOrCloseError(PojoEndpointBase.java:96)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:81)
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:48)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:136)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1735)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
解决方法

第一步:引入全局工具类

package com.gdpu.middleware.utils;

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

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext applicationContextSpring;
    @Override
    public synchronized void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        applicationContextSpring = applicationContext;
    }
    public static <T> T getBean(Class<T> clazz) {

        return applicationContextSpring.getBean(clazz);
    }

}

第二步:websocket里通过工具类引入

	private UserMapper userMapper = ApplicationContextProvider.getBean(UserMapper.class);
    private UserService userService =ApplicationContextProvider.getBean(UserService.class);

    private MessageMapper messageMapper = ApplicationContextProvider.getBean(MessageMapper.class);
    private MessageService messageService = ApplicationContextProvider.getBean(MessageService.class);
    //时间处理工具
    private TimeTool timeTool = ApplicationContextProvider.getBean(TimeTool.class);
    //在线用户工具
    private ChatUserUtil chatUserUtil = ApplicationContextProvider.getBean(ChatUserUtil.class);
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出在WebSocketServer类中存在注入问题。在引用\[2\]中,通过@Autowired注解将LearnedCourseCacheService注入WebSocketServer类中的cacheService属性上,但是注入失败,cacheService为null。而在引用\[3\]中,项目启动时初始化的WebSocket对象可以成功注入service,但是当新用户进入聊天时,系统会创建一个新的WebSocket对象,这时由于Spring默认管理的是单例,所以无法给第二个WebSocket对象注入service,导致注入失败。 因此,解决注入WebSocketServer的问题可以尝试以下方法: 1. 确保WebSocketServer类被正确注解为@Component,以便Spring能够扫描到并管理该类。 2. 确保LearnedCourseCacheService类被正确注解为@Service或@Component,以便Spring能够正确创建并管理该类的实例。 3. 确保WebSocketServer类中的@Autowired注解被正确使用,注入LearnedCourseCacheService时,可以尝试使用构造函数注入或者在属性上使用@Autowired注解。 4. 如果WebSocketServer类需要被多个用户连接使用,可以考虑使用@Scope注解为每个WebSocket对象创建一个新的实例,以避免注入失败的问题。 综上所述,可以尝试以上方法来解决注入WebSocketServer的问题。 #### 引用[.reference_title] - *1* *2* [WebSocketServer无法注入Bean](https://blog.csdn.net/qq_45537574/article/details/122879256)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SpringBoot中集成websocketWebSocketServer中注入mapper为空](https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127072530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值