当前位置: 首页 > 知识库问答 >
问题:

Spring Boot-WebSocket控制器问题

唐利
2023-03-14

我正在尝试在我的应用程序中实现一些websocket的东西。我使用Spring Boot和Groovy来实现这一点。但是我对Spring控制器发送但没有正确处理的websocket消息有一些麻烦。我试图搜索同样的问题,但没有找到任何有用的信息。

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

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

信息3778---[main]s.a.simpanNotationMethodMessageHandler:将“{[/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'}));
});

它发送消息但没有回复。我在controller方法中添加了打印消息,它不打印任何内容,所以发送的问候消息不会传递给controller方法,甚至不会调用它。我甚至尝试设置映射来处理所有消息@messageMapping('/**'),但没有成功。

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

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

如果有任何帮助,我将不胜感激。提前道谢。

共有1个答案

佴阳曦
2023-03-14

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

“应用程序/您好”

而不是

“/App/Hello”

因此不应该是stompclient.send(“app/hello”,{},json.stringify({'name':'my name'}));而是stompclient.send(“/app/hello”,{},json.stringify({'name':'my name'}));

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

 类似资料:
  • 定义 <?php namespace ImiDemo\WebSocketDemo\MainServer\WSController\Index; use Imi\ConnectContext; use Imi\Controller\WebSocketController; use Imi\Server\Route\Annotation\WebSocket\WSRoute; use Imi\Serv

  • 在使用Springboot创建API以及理解bean的工作方式方面有点困难。 我有三门课,我尽可能简化了它们; 我的问题是,在控制器中,我没有从创建的ClassA对象myClass中获取neededVar,实际上我不确定我得到了什么。 我也尝试过这样做,得到了类似的结果。 如果有人能为我指出正确的方向,将neededVar从应用程序中的实例化ClassA中获取到我的rest控制器(以及随后我将创建

  • 容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptables 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。 容器访问外部网络 容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 $sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1 如果为 0,

  • 问题内容: 为什么无法从另一个内部访问其他控制器方法呢? 像这样。 已编译 如果您不能这样做,那为什么不呢?我还应该怎么做… 问题答案: 最近几个小时遇到相同的问题。我使用了api / services文件夹。它可能不完全是您所需要的,但是它是一个选择。

  • 我有一个关于spring websockets的问题,上面有STOMP协议。我将websockets用于不同的应用程序,但不是与spring的结合。 我有一个客户机服务器应用程序,它持有多个到服务器的websockets连接。现在我可以创建一个客户端应用程序,它连接到spring的Websocket(使用STOMP)。同样,我可以将一个websocket映射到spring的多个控制器吗?每个控制器