当你看到这里的时候,相信你也是遇到了同样的问题
最近需要整合Websocket,@ServerEndpoint注解所标注的类,类似于我们写的@Controller标注的Controller层,
直接和页面交互(还没深究,先这样理解)。结果@Autowire注入的Service层的bean为null,然后检查配置,各种姿势测试这个bean,发现和
@ServerEndpoint有关。先看代码款式
@Controller
@ServerEndpoint("/websocket/{clientId}")
public class WebSocket {
@Autowired
private IClientService clientService;//这玩意为null
@Autowired
private IMessageService messageService;//这玩意也为null
其实这里的@Controller是一个装饰品,完全可以去掉。为什么没注入进去?传送门在这,点击查看老外的解释
所以注定,你要用 @ServerEndpoint实现ws,就注定不能用@Autowired注入bean,那咋整?new一个?肯定不行。思来想去,你不就是要个bean么,我@Autowired把你召唤不出来,那我拿spring上下文把你getBean(“name”)一下如何,注解用不了咱原生走一波。
那么问题又来了,容器启动的时候spring上下文已经加载了,怎样拿到这个上下文?传送门点击参考
好了,拿到上下文就好说了,直接getBean就OK。
看看代码片段
//这里@Controlle或者@Component都不要,只要一个ws的的注解就行
@ServerEndpoint("/websocket/{clientId}")
public class WebSocket {
//这里@Autowired或者@Resource也不需要,咱用原生的获取bean
private IClientService clientService;
private IMessageService messageService;
@OnOpen //有连接进来就给service层的bean进行初始化获取
public void onOpen(@PathParam(value="clientId")String clientId,Session session){
if(this.clientService == null){
this.clientService = (IClientService)SpringContextUtil.getBean("clientService");
}
@OnMessage//这个也是bean初始化获取
public void onMessage(@PathParam(value="clientId")String clientId,String message, Session session) {
if(this.messageService == null){
messageService = (IMessageService)SpringContextUtil.getBean("messageService");
}
好了,这个问题目前来说看起来很好的解决了,后面遇到问题再研究。
在尝试使用Spring整合WebSocket时,发现在@ServerEndpoint注解的类中,通过@Autowired注解注入的bean为null。经过研究,发现@ServerEndpoint与@Autowired不兼容。为解决此问题,可以利用Spring上下文在运行时获取bean,通过ApplicationContext获取所需的bean并避免直接new实例。问题暂时得到解决,后续遇到的新问题有待进一步探索。

2874

被折叠的 条评论
为什么被折叠?



