2016-08-30 2 views
2

Ich benutze Spring-Boot. Ich möchte JAX RS als meine grundlegende REST-API in Kombination mit WebSockets (mit Stomp) verwenden. Diese beiden Bibliotheken scheinen jedoch in einem Konflikt zu enden.JAX RS und WebSockets mit Stomp im Frühjahr Boot-Konflikt

Ich habe folgendes 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(); 
} 

und die folgende AppConfig.

public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     register(...); 
    } 
} 

Das Problem tritt auf, wenn beide Klassen in kommentiert werden, wenn ich AppConfig Kommentar aus, meine pfannen Verbindung wird ohne Probleme verbinden. In den anderen Fällen funktioniert meine REST-API, aber die WebSocket-Verbindung kann nicht hergestellt werden (Ausnahme 404). Ich nehme an, dass das Problem in der Jax RS-Komponente liegt, die wahrscheinlich versucht, den Aufruf/Hallo zu "konsumieren" und keine Ressource findet, die ihr zugeordnet ist.

Meine Frage ist: Wie kann ich Jax RS sagen, entweder den/hallo Anruf zu ignorieren, so dass es an den WebSocketMessageBroker weitergegeben wird oder damit es nebeneinander funktioniert?

Antwort

3

Es ist verwandt mit Spring-Boot Jersey: allow Jersey to serve static content. Das Standard-Mapping für das Jersey-Servlet ist /*, das alle Anfragen aufschnappt. Standardmäßig werden keine Routen weitergeleitet, für die es nicht gefunden werden kann.

Sie haben paar Optionen:

  • Ändern Sie die Standardzuordnung für den Servlet-Jersey. Sie können dies entweder durch

    1. Hinzufügen einer @ApplicationPath("/new-root") annotation on top of the ResourceConfig` Unterklasse.
    2. Oder die Zuordnung in der application.properties Datei einstellen, die folgende Eigenschaft mit: spring.jersey.applicationPath
  • Make Jersey laufen als Servlet Filter anstelle eines Servlet. Auf diese Weise können Sie eine Eigenschaft mit Jersey festlegen, die es ermöglicht, angeforderte Routen an den Servlet-Container weiterzuleiten, die nicht in der Jersey-Anwendung zugeordnet sind.

    können Sie sehen, wie diese Lösung zu arbeiten, in this post

+0

Danke, genau das, was ich gesucht habe .. – Frame91