@MessageMapping在通过WebSocket从Javascript推送消息时不触发控制器

时间:2015-03-27 08:10:31

标签: websocket stomp sockjs spring-websocket

我尝试使用Spring 4.1.1,Stomp 2.3.3,sockjs 0.3.4进行WebSocket演示

在服务器端: 有一个配置文件

@Configuration
@EnableWebSocketMessageBroker
public class AppWebSocketConfig extends
        AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic/");
        config.setApplicationDestinationPrefixes("/app");
    }

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

这是一个处理消息的控制器

@Controller
public class EBConsoleWebSocketController {

    private static final Logger LOG = Logger
            .getLogger(EBConsoleWebSocketController.class);

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

    public class HelloMessage implements Serializable {

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

    public class Greeting implements Serializable {
        private String content;

        public Greeting(String content) {
            super();
            this.content = content;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

    }
}

问题似乎是@MessageMapping不会触发问候方法。

这是客户端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("<c:url value='/hello'/>");
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function(greeting) {
                showGreeting(JSON.parse(greeting.body).content);
            });
        });
    }

    function disconnect() {
        if (stompClient != null) {
            stompClient.disconnect();
        }
        setConnected(false);
        console.log("Disconnected");
    }

    function sendName() {
        var name = document.getElementById('name').value;
        stompClient.send("/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);
    }

0 个答案:

没有答案