首页 文章

Spring Boot - websocket控制器问题

提问于
浏览
0

我正在尝试在我的应用程序中实现一些websocket的东西 . 我正在使用Spring Boot和Groovy来实现这一目标 . 但是我遇到了一些问题,包括发送但未被Spring控制器正确处理的websocket消息 . 我试图搜索相同的问题,但没有找到任何有用的信息 .

目前,为了简化,我使用了与此处相同的类:https://github.com/spring-guides/gs-messaging-stomp-websocket

当我运行我的应用程序时,在控制台中我看到:

INFO 3778 --- [main] sasSimpAnnotationMethodMessageHandler:将“{[/ hello / **],messageType = [MESSAGE]}”映射到公共org.myapp.Greeting org.myapp.GreetingController.greeting(org.myapp.HelloMessage) )抛出java.lang.Exception

所以它看起来不错 . 但事实上,事实并非如此 . 我的控制器代码:

@Controller
class GreetingController {

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

}

我的websocket配置是:

@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

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

}

我可以连接到上面的websocket,但发送任何消息不会产生任何影响 . 我正在使用以下javascript代码:

var stompClient = null;
var socket = new SockJS('/hello');

stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
  console.log('Connected: ' + frame);
  stompClient.subscribe('/topic/greetings', function (greeting) {
    console.log('received message');
    console.log(greeting);
  });
  stompClient.send("app/hello", {}, JSON.stringify({'name': 'my name'}));
});

它发送消息但没有回复 . 我在控制器方法中添加了打印消息,并且它没有传递给控制器方法,甚至没有调用它 . 我甚至尝试设置映射来处理所有消息 @MessageMapping('/**') 但它没有用 .

这是调用上面的javascript代码后的Spring日志(调试级别):

2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] osweb.servlet.DispatcherServlet:名为'dispatcherServlet'的DispatcherServlet处理[/ hello / info] 2015的GET请求09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] swsmmaRequestMappingHandlerMapping:查找path / hello / info的处理程序方法2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] swsmmaRequestMappingHandlerMapping:找不到[/ hello / info]的处理程序方法2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] oswshandler .SimpleUrlHandlerMapping:请求[/ hello / info]的匹配模式是[/ hello /] 2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] oswshandler.SimpleUrlHandlerMapping:URI模板请求变量[/ hello / info]是{} 2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] oswshandler.SimpleUrlHandlerMapping:将[/ hello / info]映射到HandlerExecutionChain with handler [org.springframework.web.socket.sockjs.support.SockJ sHttpRequestHandler @ 31e2232f]和1拦截器2015-09-02 21:47:49.593 DEBUG 3778 --- [nio-8080-exec-5] osweb.servlet.DispatcherServlet:[/ hello / info]的Last-Modified值是: - 2015-09-02 21:47:49.594 DEBUG 3778 --- [nio-8080-exec-5] oswssthDefaultSockJsService:GET http:// localhost:8080 / hello / info?t = 1441223269561 2015-09- 02 21:47:49.594 DEBUG 3778 --- [nio-8080-exec-5] osweb.servlet.DispatcherServlet:Null ModelAndView返回DispatcherServlet,名称为“dispatcherServlet”:假设HandlerAdapter完成请求处理2015-09-02 21: 47:49.594 DEBUG 3778 --- [nio-8080-exec-5] osweb.servlet.DispatcherServlet:已成功完成请求2015-09-02 21:47:49.600 DEBUG 3778 --- [nio-8080-exec-8 ] osweb.servlet.DispatcherServlet:名为'dispatcherServlet'的DispatcherServlet处理[/ hello / 721 / 4hmzc45f / websocket]的GET请求2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec- 8] swsmmaRequestMappingHandlerMapping:查找处理程序m路径/ hello / 721 / 4hmzc45f / websocket 2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec-8] swsmmaRequestMappingHandlerMapping:找不到[/ hello / 721 /的处理程序方法4hmzc45f / websocket] 2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec-8] oswshandler.SimpleUrlHandlerMapping:请求匹配模式[/ hello / 721 / 4hmzc45f / websocket]是[/你好/] 2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec-8] oswshandler.SimpleUrlHandlerMapping:URI请求的模板变量[/ hello / 721 / 4hmzc45f / websocket]是{} 2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec-8] oswshandler.SimpleUrlHandlerMapping:使用处理程序[org.springframework.web]将[/ hello / 721 / 4hmzc45f / websocket]映射到HandlerExecutionChain .socket.sockjs.support.SockJsHttpRequestHandler @ 31e2232f]和1拦截器2015-09-02 21:47:49.601 DEBUG 3778 --- [nio-8080-exec-8] osweb.servlet.DispatcherServlet:Last-Modified值for [/ hello / 721 / 4hmzc45f / websocket]是:-1 2015-09-02 21:47:49.603 DEBUG 3778 --- [nio-8080-exec-8] osweb.servlet.DispatcherServlet:Null ModelAndView返回DispatcherServlet,名称为“dispatcherServlet”:假设HandlerAdapter完成请求处理2015-09-02 21:47 :49.603 DEBUG 3778 --- [nio-8080-exec-8] osweb.servlet.DispatcherServlet:已成功完成请求2015-09-02 21:47:49.604 DEBUG 3778 --- [nio-8080-exec-8] swshLoggingWebSocketHandlerDecorator:新的WebSocketServerSockJsSession [id = 4hmzc45f]

我尝试使用相同的依赖项(我'm using Gradle if that'重要)和类作为gs-messaging-stomp-websocket(https://github.com/spring-guides/gs-messaging-stomp-websocket),但没有帮助 .

我不知道这里发生了什么,为什么代码不起作用 .

一世非常感谢任何帮助 . 提前致谢 .

1 回答

  • 0

    几个小时后我终于找到了一个解决方案...在javascript代码我发布了我发送消息给

    “app / hello”

    代替

    “/ app / hello”

    所以它不应该 stompClient.send("app/hello", {}, JSON.stringify({'name': 'my name'}));stompClient.send("/app/hello", {}, JSON.stringify({'name': 'my name'}));

    这么简单和愚蠢的事情,但很难找到...也许有人会有同样的问题,并找到这个解决方案,所以我不删除我的问题 .

相关问题