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();
    }
}

执行结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring boot redis cache的key的使用方法

    Spring boot redis cache的key的使用方法

    这篇文章主要介绍了Spring boot redis cache的key的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java 超详细讲解IO操作字节流与字符流

    Java 超详细讲解IO操作字节流与字符流

    本章具体介绍了字节流、字符流的基本使用方法,图解穿插代码实现。 JAVA从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助
    2022-03-03
  • idea指定maven的settings文件不生效的问题解决

    idea指定maven的settings文件不生效的问题解决

    本文主要介绍了idea指定maven的settings文件不生效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringBoot使用WebSocket实现前后端交互的操作方法

    SpringBoot使用WebSocket实现前后端交互的操作方法

    springboot使用websocket有两种方式,一种是实现简单的websocket,另外一种是实现STOMP协议,本篇讲述如何使用springboot实现简单的websocket,需要的朋友可以参考下
    2022-04-04
  • Spring Boot配置接口WebMvcConfigurer的实现

    Spring Boot配置接口WebMvcConfigurer的实现

    这篇文章主要介绍了SpringBoot配置接口WebMvcConfigurer的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 解决JDK版本冲突显示问题(双版本冲突)

    解决JDK版本冲突显示问题(双版本冲突)

    这篇文章主要介绍了解决JDK版本冲突显示问题(双版本冲突),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Eolink上传文件到Java后台进行处理的示例代码

    Eolink上传文件到Java后台进行处理的示例代码

    这篇文章主要介绍了Eolink上传文件到Java后台进行处理,这里是上传的excel表格数据并转换为java集合对象、然后进行业务逻辑处理判断最后保存到数据库 ,需要的朋友可以参考下
    2022-12-12
  • java子类调用父类的方法中包含子类重写的实例方法

    java子类调用父类的方法中包含子类重写的实例方法

    在本篇文章里小编给大家整理了关于java子类调用父类的方法中包含子类重写的实例方法以及相关知识点,需要的朋友们可以学习下。
    2019-09-09
  • Mybatis以main方法形式调用dao层执行代码实例

    Mybatis以main方法形式调用dao层执行代码实例

    这篇文章主要介绍了Mybatis以main方法形式调用dao层执行代码实例,MyBatis 是一款优秀的持久层框架,MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,需要的朋友可以参考下
    2023-08-08
  • Java调用浏览器打开网页完整实例

    Java调用浏览器打开网页完整实例

    这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论