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

Spring Boot冲突中带有Stomp的JAX RS和WebSockets

穆彬郁
2023-03-14

我正在使用Spring Boot。我想将JAX RS作为我的基本REST-API与WebSockets结合使用(使用Stomp)。然而,这两个图书馆似乎最终陷入了冲突。

我有以下WebSocketConfig:

@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("/hello").setAllowedOrigins("http://localhost:8000").withSockJS();
}

以及以下AppConfig:

public class AppConfig extends ResourceConfig {
   public AppConfig() {
      register(...);
   }
}

如果两个类都在。如果我注释掉AppConfig,我的套接字连接将没有任何问题。在其他情况下,我的REST-Api可以工作,但是无法建立web socket-Connection(404异常)。我认为问题出在Jax RS组件上,它可能试图“消费”/hello调用,并且没有找到映射到它的资源。

我的问题是:我怎样才能告诉 Jax RS 忽略 /hello 呼叫,以便将其传递到 WebSocket消息代理或让它彼此相邻工作?

共有1个答案

柴瀚
2023-03-14

它与Spring-Boot泽西有关:允许泽西提供静态内容。泽西servlet的默认映射是/*,它占用了所有请求。默认情况下,它不会转发任何找不到的路由。

您有两种选择:

>

  • 更改泽西servlet的默认映射。您可以通过

      < li >在< code>ResourceConfig子类上添加< code > @ application path("/new-root ")批注。 < li >或者使用以下属性在< code > application . properties 文件中设置映射:< code > spring . jersey . application path

    使 Jersey 作为 servlet 过滤器运行,而不是作为 servlet 运行。这样做允许您使用 Jersey 设置一个属性,该属性将允许它将请求的路由转发到 Servlet 容器,这些路由未在 Jersey 应用程序中映射。

    在这篇文章中,你可以看到如何解决这个问题

  •  类似资料:
    • 我们正在将SpringWebSockets集成到我们的应用程序中,我运行了HelloWorld示例,令人惊讶的是,spring为我们连接了一切,以便将服务器端通知推送到客户端。 不过,我有一些简单的问题 1) 队列是如何创建的?我使用的是ActiveMQ,队列名称与我在目的地中指定的不同(例如,像greetings-user3n9\u jn3i)。 2)目标名称是否不同于队列? 3) 我正在使用A

    • 问题内容: 如您所知,角形和细枝形都有共同的控制结构-双花括号。如何更改Angular的默认值? 我知道我可以在Twig中做到这一点,但是在某些项目中,我只能做到JS。 问题答案: 您可以使用service 更改开始和结束插值标签。一个方便的地方是在模块初始化时。 https://docs.angularjs.org/api/ng/provider/$interpolateProvider

    • 我有一个带有如下所示的文件: 我们过去常常使用注释来读取这些值,因此字符串与“子设置”的前缀相同。 我的任务是清理这个应用程序,我想使用与属性文件内容相匹配的大型配置对象来使用,以使代码更易于使用。 我认为configuration类的结构应该是这样的(Kotlin示例,但这并不重要): 请注意,也用于决定注册哪个bean: 如何设置此配置(无需重写以消除此应用程序所有实例的命名问题)?

    • 问题内容: 我正在尝试在同时引用 jQueryUI 和 Bootstrap 3 的View 上使用。如果我在jQueryUI的js之后加载Boostrap,则调用成功,但是如果我在Bootstrap之后调用jQueryUI,则出现错误,并且没有任何效果。您可以自己尝试。互联网上对此进行了大量讨论,我询问了有关GitHub的问题,但我还找不到解决方案。 问题答案: 理想的解决方案是采用没有工具提示的

    • 我所有涉及gui的代码都有问题。例如,公共类Ritboard扩展Jboard行给我一个错误: 在javax.swing.JComponent中的getBaselineResizeBeacior()与在java.awt.Component中的getBaselineResizeBeacior()冲突;试图使用不兼容的返回类型 他的权宜之计是实施什么都不做的方法。我也尝试重新安装IntelliJ。有谁知

    • 我们有一个子类,我们不需要任何等号和哈希码比较。它在超级类中处理。 但是FindBugs给出了错误-EQ_DOESNT_OVERRIDE_EQUALS:这个类扩展了一个类,该类定义了一个EQUALS方法并添加了字段,但没有定义EQUALS法本身。因此,该类实例上的相等将忽略子类的标识和添加的字段。确保这是预期的,并且您不需要重写equals方法。即使您不需要重写equals方法,也可以考虑无论如何