这是因为Spring 管理的 bean 是通过 Spring 容器来注入的,而 WebSocket 的端点 (@ServerEndpoint
) 是由 WebSocket 容器(例如 Tomcat、Jetty)直接管理的。这意味着 WebSocket 端点可能在 Spring 容器创建之前就已经被创建,从而导致 Spring 容器无法注入 bean。
@Autowired
private UserService userService;
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("userId") Integer userId) {
this.CurrentUserName = userService.getUserName(userId);
所以直接使用注解去注入Bean的话,,很有可能会抛出空指针异常
所以,解决方法是使用配置类的写法,可以在 WebSocket 端点中手动获取 Spring 上下文,以便获取 UserService
实例。
private static UserService userService;
@Autowired
public void setUserService(UserService userService) {
WebSocketServer.userService = userService;
}