JAX RS和WebSockets在Spring Boot中使用Stomp时发生冲突

3
我是一个使用Spring-Boot的开发者。我希望能够结合WebSockets(使用Stomp协议)使用JAX RS作为我的基础REST-API。但是这两个库似乎会发生冲突。
以下是我的WebSocket配置:
@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连接无法建立(404异常)。我认为问题在于Jax RS组件,它可能试图“消耗”/hello调用并找不到映射到它的资源。
我的问题是:如何告诉Jax RS要么忽略/hello调用,以便它通过WebSocketMessageBroker传递,要么使它们同时工作?
1个回答

5
这与Spring-Boot Jersey:允许Jersey提供静态内容有关。Jersey servlet的默认映射是/*,它会占用所有请求。默认情况下,它不会转发任何找不到的路由。
您有几个选项:
  • 更改Jersey servlet的默认映射。您可以通过以下方式之一来实现:
    1. ResourceConfig子类顶部添加一个@ApplicationPath("/new-root")注释。
    2. 或在application.properties文件中设置映射,使用以下属性:spring.jersey.applicationPath
  • 将Jersey作为servlet filter运行,而不是servlet。这样做可允许您设置一个Jersey属性,使其将未在Jersey应用程序中映射的请求路由转发到servlet容器。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接