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

时间:2016-08-30 11:50:27

标签: java spring web-services rest

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

我有以下WebSocketConfig:

condition

以及以下AppConfig:

@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,我的socket连接将连接没有任何问题。在其他情况下,我的REST-Api工作但无法建立WebSocket-Connection(404例外)。我认为问题在于Jax RS组件,它可能会尝试“消耗”。 / hello调用并没有找到映射到它的资源。

我的问题是:如何告诉Jax RS忽略/ hello调用,以便将它传递给WebSocketMessageBroker或让它在彼此旁边工作?

1 个答案:

答案 0 :(得分:3)

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

你有几个选择:

  • 更改Jersey servlet的默认映射。你可以通过

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

    您可以在this post

  • 中查看如何使用此解决方案