WebSocketStompClient stellt keine Verbindung zum SockJS-Endpunkt her

Ich spiele mit der neuen (ab Version 4.2) Java STOMP-Client-Unterstützung herum. Mein Ausgangspunkt ist die Kurzanleitung Mit WebSocket eine interaktive Webanwendung erstellen).

Der folgende Endpunkt wird im Beispiel bereitgestellt:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/hello").withSockJS();
}

Ich kann mit dem Browser-Client erfolgreich eine Verbindung herstellen. Wenn Sie versuchen, mit dem Java-Stomp-Client eine Verbindung zu diesem Endpunkt herzustellen, gehen Sie wie folgt vor:

WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
stompClient.setMessageConverter(new StringMessageConverter());
String url = "ws://127.0.0.1:8080/hello";       
ListenableFuture<StompSession> future = stompClient.connect(url,myHandler);

Ich stoße auf die folgende Ausnahme:

08:56:30.629 [SimpleAsyncTaskExecutor-1] DEBUG o.s.m.simp.stomp.DefaultStompSession - Failed to connect session id=4e6737da-8f68-691d-375f-9e46f48bc149
javax.websocket.DeploymentException: The HTTP response from the server [HTTP/1.1 200 OK
] did not permit the HTTP upgrade to WebSocket
    at org.apache.tomcat.websocket.WsWebSocketContainer.parseStatus(WsWebSocketContainer.java:637) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20]
    at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:621) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20]
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:309) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20]
    at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:152) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT]
    at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:149) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT]
    at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0] 

Nach weiteren Untersuchungen habe ich die Server-Endpunktkonfiguration basierend auf TomcatWebSocketTestServer.java, die in StompWebSocketIntegrationTests.java verwendet wird, wie folgt geändert:

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
    .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
    .setAllowedOrigins("*");

Ich kann jetzt eine Verbindung herstellen, die Browser-Clients jedoch nicht.

GET http://localhost:8080/hello/info 404 (Not Found) 

Wenn ich der Endpunktkonfiguration .withSockJs () hinzufüge:

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
    .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
    .setAllowedOrigins("*")
    .withSockJs();

Die Browser-Clients können erneut eine Verbindung herstellen, der Java-Client kehrt jedoch zum ursprünglichen Fehler zurück.

Sollte ich in der Lage sein, denselben Endpunkt für beide Clients freizugeben, oder muss ich in diesem Fall zwei separate Endpunkte konfigurieren?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage