Spring Websocket не достигает контроллера

Я пытаюсь реализовать этот пример websocket, но в настоящее время запросы не перенаправляются на мои контроллеры Spring.

http://spring.io/guides/gs/messaging-stomp-websocket/

Ниже приведен мой класс WebSocketConfig:

package com.kinnect.mobile.gateway.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@ComponentScan(basePackages = {"com.kinnect.mobile.gateway.controller"})
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

 @Override
 public void configureMessageBroker(MessageBrokerRegistry config) {
 config.enableSimpleBroker("/topic");
 config.setApplicationDestinationPrefixes("/app");
 }

 @Override
 public void registerStompEndpoints(StompEndpointRegistry registry) {
 registry.addEndpoint("/hello").withSockJS();
 }

}

Вот мой контроллер:

package com.kinnect.mobile.gateway.controller;

import hello.Greeting;
import hello.HelloMessage;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

 @Controller
 public class GreetingController {

 @MessageMapping("/hello")
 @SendTo("/topic/greetings")
 public Greeting greeting(HelloMessage message) throws Exception {
 System.out.println("Test...");
 return new Greeting("Hello, " + message.getName() + "!");
 }

 }

Вот мой JavaScript, используемый для вызова контроллера:

var stompClient = null;

 function setConnected(connected) {
 document.getElementById('connect').disabled = connected;
 document.getElementById('disconnect').disabled = !connected;
 document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
 document.getElementById('response').innerHTML = '';
 }

 function connect() {
 var socket = new SockJS('http://localhost:8080/KinnectMobileGateway/hello');
 stompClient = Stomp.over(socket);
 stompClient.connect({}, function(frame) {
 setConnected(true);
 console.log('Connected: ' + frame);
 stompClient.subscribe('http://localhost:8080/KinnectMobileGateway/topic/greetings', function(greeting){
 console.log("Greeting received!");
 showGreeting(JSON.parse(greeting.body).content);
 });
 });
 }

 function disconnect() {
 stompClient.disconnect();
 setConnected(false);
 console.log("Disconnected");
 }

 function sendName() {
 var name = document.getElementById('name').value;
 stompClient.send("http://localhost:8080/KinnectMobileGateway/app/hello", {}, JSON.stringify({ 'name': name }));
 }

 function showGreeting(message) {
 var response = document.getElementById('response');
 var p = document.createElement('p');
 p.style.wordWrap = 'break-word';
 p.appendChild(document.createTextNode(message));
 response.appendChild(p);
 }

Я могу установить соединение сокета, и я вижу это в консоли на сервере, когда я пытаюсь выполнить соединение сокета, но System.out.println("Test") не запускается:

16:13:47.044 [http-bio-8080-exec-2] DEBUG o.s.m.simp.stomp.StompDecoder - Decoded [Payload byte[14]][Headers={stompCommand=SEND, nativeHeaders={content-length=[14], destination=[http://localhost:8080/KinnectMobileGateway/app/hello]}, simpMessageType=MESSAGE, simpDestination=http://localhost:8080/KinnectMobileGateway/app/hello, id=b49ca021-a789-9fdc-66cd-413d7549fb90, timestamp=1400573627044}]

Я думаю, что конфигурация некорректна, и мой класс контроллера не регистрируется при запуске, но я не уверен, как это сделать. Пожалуйста помоги!

1 ответ

Попробуй это:

stompClient.subscribe('/topic/greetings'
...

stompClient.send("/app/hello"

Вы должны использовать relative paths для своей логики. StackTrace говорит вам правильную информацию:

simpDestination=http://localhost:8080/KinnectMobileGateway/app/hello

Но ваше назначение - /app/hello

licensed under cc by-sa 3.0 with attribution.