spring使用WebSocket注入service层失败问题及解决
使用WebSocket注入service层失败
这里spring集成的是javax包下的WebSocket,出现了注入service层的异常,如果是使用spring-websocket则没有这个问题。
spring集成javax包下的WebSocket需要配置ServerEndpointExporter实例。
<bean class="org.springframework.web.socket.server.standard.ServerEndpointExporter"/>
这样注入service层失败,调用userService是报空指针异常,注入失败:
@Autowired
private IUserService userService;
原因
当有连接接入时,会创建一个新的服务器类对象,而spring只会给IOC容器启动时创建的对象注入userService,连接接入时创建的对象并没有注入
如下实验:
@Component
@ServerEndpoint(value = "/javaconver/{id}")
public class Conversation {
@Autowired
private IUserService userService;
//concurrent包的线程安全,用来存放每个客户端对应的WebSocket
private static ConcurrentHashMap<String, Conversation> sockets = new ConcurrentHashMap<>();
@OnOpen
public void open(Session session, @PathParam("id")String id){
sockets.put(id,this);
System.out.println(sockets);
}
}这是写了两个页面连接的结果:

可见确实是两个不同的对象。
解决方法
将userService设为静态变量,但是要注意:
@Autowired
private static IUserService userService;这样写仍然会报空指针异常,因为spring不会给静态变量注入

正确写法:
@Component
@ServerEndpoint(value = "/javaconver/{id}")
public class Conversation {
private static IUserService userService;
@Autowired
public void setUserService(IUserService userService) {
System.out.println("执行seter方法");
this.userService = userService;
System.out.println(this.userService);
}
//concurrent包的线程安全,用来存放每个客户端对应的WebSocket
private static ConcurrentHashMap<String, Conversation> sockets = new ConcurrentHashMap<>();
@OnOpen
public void open(Session session, @PathParam("id")String id){
sockets.put(id,this);
System.out.println(sockets);
System.out.println(sockets.get(id).userService);
System.out.println(Conversation.userService);
}
@OnMessage(maxMessageSize = 56666)
public void message(String str, Session session){
userService.out();
}
}执行结果:


总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
浅析如何将多个SpringBoot项目打包到一个Docker容器中
在现代软件开发中,Docker已成为一种流行的容器化技术,能够简化应用的部署和管理,本文将详细介绍如何将多个Spring Boot项目打包到一个Docker容器中,希望对大家有所帮助2024-10-10
Java 泛型通配符 <? extends> vs <? s
本文解析Java泛型通配符<? extends T>和<? super T>的核心区别与应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2025-12-12
Spring Data JPA的Audit功能审计数据库的变更
数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便,本文讨论Spring Data JPA审计数据库变更问题,感兴趣的朋友一起看看吧2021-06-06
Java中的CompletableFuture核心用法和常见场景
CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过实用示例和注意事项,展示了如何在实际场景中应用CompletableFuture,以提高并发能力和响应速度,感兴趣的朋友跟随小编一起看看吧2025-12-12
SpringBoot静态函数无法自动注入Bean的原因分析与解决方案
在 Spring Boot 项目中,开发者常遇到一个典型问题:在静态方法或静态变量中尝试使用 @Autowired 注入 Bean 时,始终得到 null 值,本文将深入剖析这一问题的根源,并提供多种可靠解决方案,需要的朋友可以参考下2025-08-08


最新评论