Spring Websocket没有达到控制器

时间:2014-05-20 15:14:43

标签: java javascript spring sockets websocket

我正在尝试实现这个websocket示例,但目前请求没有路由到我的Spring Controller。

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 个答案:

答案 0 :(得分:0)

试试这个:

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

stompClient.send("/app/hello"

您应该使用relative paths作为逻辑。 StackTrace说你正确的信息:

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

但您的目的地为/app/hello