SpringBoot项目集成websocket,建立连接之后发现自动注入为NullException。
因为spring是单例而websocket是多对象(每建立一次连接就生成一个对象)
所以在项目启动的时候,会初始化websocket,并且注入到spring容器中,这个时候注入的service是不为null的,但是spring是单例,所以只会注入一次,当再次建立websocket连接时,这个时候对象就为NullException了。
解决方案:可以通过spring上下文获取获取bean
获取上下文工具类:
@Component public class SpringContextUtil implements ApplicationContextAware { /** * 打印日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 获取上下文对象 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtil.applicationContext = applicationContext; logger.info("set applicationContext"); } /** * 获取 applicationContext * * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通过 name 获取 bean 对象 * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通过 class 获取 bean 对象 * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通过 name,clazz 获取指定的 bean 对象 * * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
业务代码中使用:
@Component @ServerEndpoint(value = "/socket/{group}/{user}/{sessionId}") @Slf4j public class WebSocketServer { private static AtomicInteger onlineCount = new AtomicInteger(0); private static final int MAX_CONNECT = 500; private MsgGroupEnum group; private String user; private Session session; private String sessionId; public AppDataService getAppData() { return SpringContextUtil.getBean(AppDataService.class); }
}