spring整合Websocket,@ServerEndpoint注解的类无法依赖注入@Autowired无法注入bean

当你看到这里的时候,相信你也是遇到了同样的问题
最近需要整合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");
        }

好了,这个问题目前来说看起来很好的解决了,后面遇到问题再研究。

你可能感兴趣的:(Web,Scoket)