问题细节: 在tomcat8和spring4下搭建了websocket的聊天室,websocket服务端无法注入业务处理的所需要的service bean,致使websocket无法向activemq发送消息。并且还要解决获取httpsession问题。
1.出现问题的源代码
@ServerEndpoint(value="/chat") public class ChatServer { @OnMessage public void onMessage(String _message, Session session){ //省略无关代码 System.out.println("p:" + producer); producer.sendMessage(destination,_message); } }
发现producer是null,最后找到一篇博客解决问题,链接:http://www.bubuko.com/infodetail-1045860.html
解决方法也很简单,如下
@ServerEndpoint(value="/chat",configurator = SpringConfigurator.class)
2.随后根据网上教程获取Httpsession,获取Httpsession链接:https://www.cnblogs.com/zhaoww/p/5119706.html?utm_source=tuicool&utm_medium=referral
但是在@ServerEndpoint注解里面添加configurator属性出现问题,这样设置要会导致之前的空指针错误,毕竟configurator不能同时获取两个类。
@ServerEndpoint(value="/socketTest",configurator=GetHttpSessionConfigurator.class)
1.解决问题源代码
在获取Httpsession教程的基础上进行修改
package com.ws.chat; import javax.servlet.http.HttpSession; import javax.websocket.HandshakeResponse; import javax.websocket.server.HandshakeRequest; import javax.websocket.server.ServerEndpointConfig; import org.springframework.web.socket.server.standard.SpringConfigurator; public class NewConfigurator extends SpringConfigurator { @Override public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) { HttpSession httpSession = (HttpSession) request.getHttpSession(); config.getUserProperties().put(HttpSession.class.getName(), httpSession); } }
然后在@ServerEndpoint注解里面添加configurator属性
@ServerEndpoint(value="/chat",configurator = NewConfigurator.class)
这样修改就能做到既可以获取Httpsession又可以解决bean无法注入的问题。