【问题标题】:Spring Boot - websocket controller problemsSpring Boot - websocket 控制器问题
【发布时间】:2015-11-28 11:39:36
【问题描述】:

我正在尝试在我的应用程序中实现一些 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 调试 3778 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet:名为“dispatcherServlet”的 DispatcherServlet 处理 [/hello/info] 的 GET 请求 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping:查找路径 /hello/info 的处理程序方法 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping:没有找到 [/hello/info] 的处理程序方法 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping:请求的匹配模式 [/hello/info] 是 [/hello/] 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping:请求 [/hello/info] 的 URI 模板变量是 {} 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] oswshandler.SimpleUrlHandlerMapping:使用处理程序 [org.springframework.web.socket.sockjs] 将 [/hello/info] 映射到 HandlerExecutionChain .support.SockJsHttpRequestHandler@31e2232f] 和 1 个拦截器 2015-09-02 21:47:49.593 调试 3778 --- [nio-8080-exec-5] os.web.servlet.DispatcherServlet:[/hello/info] 的最后修改值为:-1 2015-09-02 21:47:49.594 调试 3778 --- [nio-8080-exec-5] o.s.w.s.s.t.h.DefaultSockJsService:获取http://localhost:8080/hello/info?t=1441223269561 2015-09-02 21:47:49.594 调试 3778 --- [nio-8080-exec-5] os.web.servlet.DispatcherServlet:空 ModelAndView 返回到名为“dispatcherServlet”的 DispatcherServlet:假设 HandlerAdapter 完成了请求处理 2015-09-02 21:47:49.594 调试 3778 --- [nio-8080-exec-5] os.web.servlet.DispatcherServlet:成功完成请求 2015-09-02 21:47:49.600 调试 3778 --- [nio-8080-exec-8] osweb.servlet.DispatcherServlet:名称为“dispatcherServlet”的 DispatcherServlet 处理 [/hello/721/4hmzc45f/websocket 的 GET 请求] 2015-09-02 21:47:49.601 调试 3778 --- [nio-8080-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping:查找路径 /hello/721/4hmzc45f/websocket 的处理程序方法 2015-09-02 21:47:49.601 调试 3778 --- [nio-8080-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping:没有找到 [/hello/721/4hmzc45f/websocket] 的处理程序方法 2015-09-02 21:47:49.601 调试 3778 --- [nio-8080-exec-8] oswshandler.SimpleUrlHandlerMapping:请求的匹配模式 [/hello/721/4hmzc45f/websocket] 是 [/hello/强>] 2015-09-02 21:47:49.601 调试 3778 --- [nio-8080-exec-8] o.s.w.s.handler.SimpleUrlHandlerMapping:请求的 URI 模板变量 [/hello/721/4hmzc45f/websocket] 是 {} 2015-09-02 21:47:49.601 调试 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 调试 3778 --- [nio-8080-exec-8] os.web.servlet.DispatcherServlet:[/hello/721/4hmzc45f/websocket] 的最后修改值为:-1 2015-09-02 21:47:49.603 调试 3778 --- [nio-8080-exec-8] os.web.servlet.DispatcherServlet:空 ModelAndView 返回到名为“dispatcherServlet”的 DispatcherServlet:假设 HandlerAdapter 完成了请求处理 2015-09-02 21:47:49.603 调试 3778 --- [nio-8080-exec-8] os.web.servlet.DispatcherServlet:成功完成请求 2015-09-02 21:47:49.604 调试 3778 --- [nio-8080-exec-8] s.w.s.h.LoggingWebSocketHandlerDecorator:新的 WebSocketServerSockJsSession[id=4hmzc45f]

我尝试使用与 gs-messaging-stomp-websocket (https://github.com/spring-guides/gs-messaging-stomp-websocket) 相同的依赖项(如果这很重要,我将使用 Gradle)和类,但没有帮助。

我不知道这里发生了什么以及为什么该代码不起作用。

我将不胜感激。提前致谢。

【问题讨论】:

    标签: spring groovy websocket spring-boot


    【解决方案1】:

    经过数小时后,我终于找到了解决方案...在我发布的 javascript 代码中,我正在向

    “应用程序/你好”

    而不是

    “/app/你好”

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

    如此简单而愚蠢的事情却很难找到......也许有人会遇到同样的问题并找到这个解决方案,所以我不会删除我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2018-02-18
      • 1970-01-01
      • 2011-06-09
      • 2021-03-23
      • 2016-09-17
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多