JAX RS 和 WebSockets 与 Spring Boot 中的 Stomp 冲突

Fra*_*e91 3 java rest spring web-services

我正在使用 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();
}
Run Code Online (Sandbox Code Playgroud)

以及以下 AppConfig:

public class AppConfig extends ResourceConfig {
   public AppConfig() {
      register(...);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果两个类都被注释,就会出现问题。如果我注释掉 AppConfig,我的套接字连接将毫无问题地连接。在其他情况下,我的 REST-Api 工作但无法建立 WebSocket-Connection(404 异常)。我认为问题出在 Jax RS 组件中,该组件可能尝试“使用”/hello 调用并且没有找到映射到它的资源。

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

Pau*_*tha 5

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

你有几个选择:

  • 更改 Jersey servlet 的默认映射。你可以通过以下任一方式做到这一点

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

    您可以在这篇文章中了解如何使用此解决方案