spring使用WebSocket注入service层失败问题及解决

 更新时间:2024年07月01日 10:26:15   作者:星海伴着风尘  
这篇文章主要介绍了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容器中

    浅析如何将多个SpringBoot项目打包到一个Docker容器中

    在现代软件开发中,Docker已成为一种流行的容器化技术,能够简化应用的部署和管理,本文将详细介绍如何将多个Spring Boot项目打包到一个Docker容器中,希望对大家有所帮助
    2024-10-10
  • Java的线程与进程以及线程的四种创建方式

    Java的线程与进程以及线程的四种创建方式

    这篇文章主要为大家详细介绍了Java的线程与进程以及线程的四种创建方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Spring MVC整合Kaptcha的具体使用

    Spring MVC整合Kaptcha的具体使用

    Kaptcha 是一个可高度配置的实用验证码生成工具,本文主要介绍了Spring MVC整合Kaptcha的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 这一次搞懂Spring自定义标签以及注解解析原理说明

    这一次搞懂Spring自定义标签以及注解解析原理说明

    这篇文章主要介绍了这一次搞懂Spring自定义标签以及注解解析原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 必须要学会的JMM与volatile

    必须要学会的JMM与volatile

    这篇文章主要介绍了必须要学会的JMM与volatile,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java 泛型通配符 <? extends> vs <? super> 实战场景

    Java 泛型通配符 <? extends> vs <? s

    本文解析Java泛型通配符<? extends T>和<? super T>的核心区别与应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • SpringBoot实战之SSL配置详解

    SpringBoot实战之SSL配置详解

    今天小编就为大家分享一篇关于SpringBoot实战之SSL配置详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Spring Data JPA的Audit功能审计数据库的变更

    Spring Data JPA的Audit功能审计数据库的变更

    数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便,本文讨论Spring Data JPA审计数据库变更问题,感兴趣的朋友一起看看吧
    2021-06-06
  • Java中的CompletableFuture核心用法和常见场景

    Java中的CompletableFuture核心用法和常见场景

    CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过实用示例和注意事项,展示了如何在实际场景中应用CompletableFuture,以提高并发能力和响应速度,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • SpringBoot静态函数无法自动注入Bean的原因分析与解决方案

    SpringBoot静态函数无法自动注入Bean的原因分析与解决方案

    在 Spring Boot 项目中,开发者常遇到一个典型问题:在静态方法或静态变量中尝试使用 @Autowired 注入 Bean 时,始终得到 null 值,本文将深入剖析这一问题的根源,并提供多种可靠解决方案,需要的朋友可以参考下
    2025-08-08

最新评论