我正在使用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或让它在彼此旁边工作?
答案 0 :(得分:3)
这与Spring-Boot Jersey: allow Jersey to serve static content有关。 Jersey servlet的默认映射是/*
,它会占用所有请求。默认情况下,它不会转发任何无法找到的路由。
你有几个选择:
更改Jersey servlet的默认映射。你可以通过
来做到这一点@ApplicationPath("/new-root") annotation on top of the
ResourceConfig`子类。application.properties
文件中设置映射:spring.jersey.applicationPath
使Jersey作为servlet运行过滤器而不是servlet。这样做允许您使用Jersey设置一个属性,该属性将允许它将请求的路由转发到servlet容器,这些路由未映射到Jersey应用程序中。
您可以在this post