脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程java→ 使用WebSocket注入service层失败

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如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
      2020-01-01
    • 本文主要介绍了springMVC中@RequestParam和@RequestPart的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
      2024-06-06
    • 这篇文章主要介绍了关于jar包增量更新分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2024-05-05
    • 这篇文章主要介绍了将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5,需要的朋友可以参考下
      2017-02-02
    • 这篇文章主要介绍了Mybatis自定义Sql模板语法问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
      2023-09-09
    • Java组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用统一的方式处理单个对象和对象组合,从而简化了系统的设计和维护
      2023-04-04
    • ZXing支持各种条形码,二维码扫描,由多个模块组成, 而且支持PC端,移动端,本文将利用zxing实现二维码生成和解析,感兴趣的小伙伴可以跟随小编一起学习一下
      2023-10-10
    • 这篇文章主要介绍了Spring Boot如何集成模板引擎FreeMarker,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
      2019-10-10
    • 这篇文章主要介绍了java 动态生成bean的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
      2021-02-02
    • 本篇文章是对java事件注册进行了详细的分析介绍,需要的朋友参考下
      2013-05-05

    最新评论