【发布时间】:2018-01-25 13:25:19
【问题描述】:
我正在尝试使用 spring websockets,但由于某种我不明白的原因,我可以与服务器建立连接,但是当我发送数据时没有任何反应。
这是我的 Config 类(完全等同于其他 spring websocket 示例):
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketsConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
}
我的控制器,在我确保 spring 初始化它的包中,因为我看到带有 @PostConstruct 注释的 init() 消息。如您所见,我编写了 System.out.println 以在控制台中查看该方法是否触发,但这从未发生过,因此数据永远不会到达控制器:
@Controller
public class MonitorSpring {
@PostConstruct
protected void init() {
System.out.println("init()");
}
@MessageMapping("/sendmessage")
@SendTo("/topic/message")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
System.out.println("sendMessage here");
return chatMessage;
}
@MessageMapping("/adduser")
@SendTo("/topic/user")
public ChatMessage addUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
System.out.println("addUser here");
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
}
最后是我的 JavaScript 客户端,我将在这里只放重要部分:
function connect(event) {
username = document.querySelector('#name').value.trim();
if(username) {
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('https://' + document.location.host + '/ws');
stompClient = Stomp.over(socket);
stompClient.connect({}, onConnected, onError);
}
event.preventDefault();
}
function onConnected() {
stompClient.subscribe('/topic/message', onMessageReceived);
stompClient.subscribe('/topic/user', onMessageReceived);
stompClient.send("/app/adduser", {}, JSON.stringify({sender: username, type: 'JOIN'}))
connectingElement.classList.add('hidden');
}
function sendMessage(event) {
var messageContent = messageInput.value.trim();
if (messageContent && stompClient) {
var chatMessage = {
sender: username,
content: messageInput.value,
type: 'CHAT'
};
stompClient.send("/app/sendmessage", {}, JSON.stringify(chatMessage));
messageInput.value = '';
}
event.preventDefault();
}
我确实连接并创建了 websocket 没有任何问题,但是当我向服务器发送一些东西时 我在 chrome 控制台中看到此消息,但服务器上没有任何反应:
>>> SEND
destination:/app/sendmessage
content-length:53
{"sender":"user1","content":"message1","type":"CHAT"}
我做错了什么?
【问题讨论】:
标签: spring stomp spring-websocket sockjs