角度+ ngStomp +弹簧websocket控制器未执行

时间:2015-08-10 09:30:25

标签: angularjs spring-mvc stomp spring-websocket sockjs

我搜索了所有的教程并完全按照那里的说明进行,但我无法联系到我的控制器。

这是我的websocket xml配置:

_e = std::move(e);

我实际上并不知道我是否需要处理程序,但没有它,stomp连接失败, “哎呀!丢失了与未定义的连接”。 对此方向的任何建议也是受欢迎的。 这是我的空处理程序:

<websocket:handlers>
    <websocket:mapping path="/updateHandler" handler="updateHandler"/>
    <websocket:sockjs/>
</websocket:handlers>

<websocket:message-broker application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/update">
        <websocket:sockjs/>
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic"/>
</websocket:message-broker>

我的控制器

 import org.springframework.web.socket.TextMessage;
        import org.springframework.web.socket.WebSocketSession;
        import org.springframework.web.socket.handler.TextWebSocketHandler;

        public class UpdateHandler extends TextWebSocketHandler {

            @Override
            protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    }
}

我正在建议使用角度为ngStomp:

@RestController
public class WebSocketController {

    @MessageMapping("/update")
    @SendTo("/topic/messages")
    public OutputMessage sendmMessage(Message message) {

        return new OutputMessage(message, new Date());
    }
}

我的留言类:

    var message = {message: 'message body', id: 1};

            $scope.testWebSocket = function () {
                $stomp.setDebug(function (args) {
                    console.log(args + '\n');
                });

                $stomp.connect('/myAppContext/update', {})
                        .then(function (frame) {
                            var connected = true;
                            var subscription = $stomp.subscribe('/topic/messages', function (payload, headers, res) {
                                $scope.payload = payload;
                            }, {});


                            $stomp.send('/myAppContext/app/update', message);

                            subscription.unsubscribe();


                            $stomp.disconnect(function () {
                              console.error('disconnected');
                            });
                        }, function(error){
                            console.error(error);
                        });
            };

我的OutputMessage类:

public class Message {

    private String message;
    private int id;

    public Message() {

    }

    public Message(int id, String text) {
        this.id = id;
        this.message = text;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

当我执行testWebSocket()时,我得到以下输出:

public class OutputMessage extends Message {

private Date time;

public OutputMessage(Message original, Date time) {
    super(original.getId(), original.getMessage());
}

public Date getTime() {
    return time;
}

public void setTime(Date time) {
    this.time = time;
}

为什么要连接服务器未定义? 为什么我的控制器在发送消息后永远不会被执行?

我使用spring-4.1.4和security-core-3.2.5以及Tomcat服务器8.0.18

1 个答案:

答案 0 :(得分:2)

作为一个非常好的解决方法,我将websocket配置移动到Java配置,它可以工作。

下面的配置:

@Configuration
@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("/update")
                .withSockJS();
    }

我其实不知道为什么。