問題細節: 在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無法注入的問題。