java - Spring Boot 中带有 Stomp 的 JAX RS 和 WebSockets 发生冲突

标签 java spring web-services rest

我正在使用 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 连接(404 异常)。我认为问题出在 Jax RS 组件上,它可能会尝试“使用”/hello 调用,但找不到映射到它的资源。

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

最佳答案

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 中了解如何使用此解决方案

关于java - Spring Boot 中带有 Stomp 的 JAX RS 和 WebSockets 发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226735/

相关文章:

java - Android加载图片到ListView AsyncTask

java - 使用 PHP/Java 桥接器时排除 ClassNotFoundException 故障

java - 关于字符串操作的问题

java - 通过 HttpPost 发送到 .net 服务的 JSONObject 正在接收 null JSONObject

java - 如何在java11中使用jdk.internal.misc.Signal

java - 如何禁用 Spring Boot 安全性

java - Spring WebSocket(Stomp)客户端代理

eclipse - 使用 Eclipse Tomcat Maven M2Eclipse 的 ClassNotFound W/Spring

java - 在 WebService 之外使用 WebServiceContext

c# - 类型初始值设定项 "Class"引发异常。LoadLibrary 失败