【问题标题】:JAX RS and WebSockets with Stomp in Spring Boot conflictSpring Boot 中的 JAX RS 和带有 Stomp 的 WebSocket 冲突
【发布时间】:2023-03-31 10:26:02
【问题描述】:

我正在使用 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 可以工作,但无法建立 WebSocket-Connection(404 异常)。我认为问题出在 Jax RS 组件上,它可能试图“使用”/hello 调用,但没有找到映射到它的资源。

我的问题是:如何告诉 Jax RS 要么忽略 /hello 调用,以便将其传递给 WebSocketMessageBroker 或使其彼此相邻工作?

【问题讨论】:

    标签: java spring web-services rest


    【解决方案1】:

    Spring-Boot Jersey: allow Jersey to serve static content 相关。 Jersey servlet 的默认映射是/*,它占用了所有请求。默认情况下,它不会转发任何它找不到的路由。

    你有几个选择:

    • 更改 Jersey servlet 的默认映射。你可以这样做

      1. ResourceConfig 子类之上添加@ApplicationPath("/new-root") 注释。
      2. 或在application.properties 文件中设置映射,使用以下属性:spring.jersey.applicationPath
    • 让 Jersey 作为 servlet filter 而不是 servlet 运行。这样做允许您使用 Jersey 设置一个属性,该属性将允许它将请求的路由转发到 servlet 容器,这些路由未在 Jersey 应用程序中映射。

      您可以在this post 中查看如何使用此解决方案

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2020-06-17
      • 2016-07-04
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多