Как отправить сообщение STOMP с помощью Spring4 при сопоставлении контроллера

#spring-4 #spring-websocket

#spring-4 #spring-websocket

Вопрос:

У меня есть следующий код…

 @Controller
@RequestMapping("/stomp/**")
public class StompController {
    @MessageMapping("/hello")
    @SendTo("/topic/greet")
    public Greeting greet(HelloMessage message) throws Exception{
        System.out.println("Inside the method " message.getName());
        Thread.sleep(3000);
        return new Greeting("Hello, " message.getName() "!");
    }
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/stomp/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

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

<script type="text/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('/stomp/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: '   frame);
            stompClient.subscribe('/stomp/topic/greet', function(greeting){
                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("/stomp/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);
    }
</script>
  

Код на стороне клиента, похоже, подключается нормально, но я не вижу сообщения консоли, означающего для меня, что «/ stomp / app / hello» — это неправильный путь. Каким должен быть правильный путь?

Я также пробовал / app / stomp / hello без кубиков…

Обновить

Я могу удалить @RequestMapping("/stomp/**") и удалить материал, связанный с stomp, и он отлично работает для моего простого теста, однако мне нужно, чтобы он работал для более сложного приложения, которое этого не допустит.

Ответ №1:

@RequestMapping и @MessageMapping аннотации могут использоваться аналогично, но совершенно по-разному. @MessageMapping также может использоваться на уровне типа (см. справочную документацию), чтобы вы могли комментировать свой контроллер с помощью @MessageMapping("/stomp/**") .

Ничто не мешает вам аннотировать контроллер как с @MessageMapping , так и @RequestMapping с аналогичной моделью программирования, для разных целей.