簡體   English   中英

JAX RS 和 WebSockets 與 Spring Boot 中的 Stomp 沖突

[英]JAX RS and WebSockets with Stomp in Spring Boot conflict

我正在使用 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-Connection(404 異常)。 我認為問題出在 Jax RS 組件中,該組件可能嘗試“使用”/hello 調用並且沒有找到映射到它的資源。

我的問題是:如何告訴 Jax RS 忽略 /hello 調用,以便將其傳遞給 WebSocketMessageBroker 或使其彼此相鄰工作?

它與Spring-Boot Jersey 相關:允許 Jersey 提供靜態內容 Jersey servlet 的默認映射是/* ,它占用所有請求。 默認情況下,它不會轉發任何找不到的路由。

你有幾個選擇:

  • 更改 Jersey servlet 的默認映射。 你可以通過以下任一方式做到這一點

    1. ResourceConfig子類的頂部添加@ApplicationPath("/new-root")注釋。
    2. 或者在application.properties文件中設置映射,使用以下屬性: spring.jersey.applicationPath
  • 使 Jersey 作為 servlet過濾器而不是 servlet 運行。 這樣做允許您使用 Jersey 設置一個屬性,該屬性將允許它將請求的路由轉發到 servlet 容器,這些路由未在 Jersey 應用程序中映射。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM