在做一个小程序聊天时,用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);