6

sockjsを使用して、STOMP over socketでSpring 4 WebSocketを使用しようとしています。そして、私は問題に直面しました。

私の構成:

websocket.xml - 春のコンテキストの一部

<websocket:message-broker application-destination-prefix="/app">  
    <websocket:stomp-endpoint path="/ws">                         
        <websocket:sockjs/>                                       
    </websocket:stomp-endpoint>                                   
    <websocket:simple-broker prefix="/topic"/>                    
</websocket:message-broker>       

コントローラーコード:

@MessageMapping("/ws")
@SendTo("/topic/ws")
public AjaxResponse hello() throws Exception {
    AjaxResponse ajaxResponse = new AjaxResponse();
    ajaxResponse.setSuccess(true);
    ajaxResponse.addSuccessMessage("WEB SOCKET!!! HELL YEAH!");
    return ajaxResponse;
}

クライアント側:

var socket = new SockJS("<c:url value='/ws'/>");               
var stompClient = Stomp.over(socket);                             
stompClient.connect({}, function(frame) {                         
    alert('Connected: ' + frame);                                 
    stompClient.send("/app/ws", {}, {});                       
    stompClient.subscribe('/topic/ws', function(response){ 
        alert(response.success);                                  
    });                                                           
});                                                               

出力:

Opening Web Socket... stomp.js:130
GET http://localhost:8080/ws/info 404 (Not Found) sockjs-0.3.js:807
Whoops! Lost connection to undefined stomp.js:130

私は何を間違っていますか?

Google で例を見つけました (TickerStocks またはそのようなもの、あいさつアプリケーション (Spring の例)) で、すべて同じエラーが発生します。ハンドシェイクで(sockjsなしで)WebSocketを使用しようとしました-同じ結果です)。

追加情報:

public AjaxResponse hello();ルート コンテキスト "/" の IndexController に配置されたメソッド。だから私はフルパスを提供することができます: http://localhost:8080/ws. テスト済みの tomcat7 と tomcat8 をデプロイします。

4

4 に答える 4

3

私はBoris The Spider のアドバイスに従い、XML 構成ファイルの代わりに Java 構成 (AppConfig および WebInit ファイル) の使用を開始しました。移行が完了したら、websockets を試してみましたが、うまくいきました。主な問題は、WebSocket の XML 構成にあると思いました。

于 2014-04-18T18:24:39.150 に答える
0

まず、アプリで宛先プレフィックスを設定したので、リクエスト URL に「アプリ」を追加する必要があります。たとえば、'/ws' を要求したい場合は、パス '/server/app/ws' で SockJS を作成する必要が var socket = new SockJS("<c:url value='/server/app/ws'/>")あります。また、'server' が springmvc 上のプロジェクト名であることもわかっています。

次に、パス '/app/*' を org.springframework.web.servlet.DispatcherServlet に追加して、接頭辞 '/app' を持つパスが web.xml で定義されたインターセプターによってインターセプトされないようにする必要があります。

于 2016-07-15T00:58:33.367 に答える
0

I think your issue can be the same of this one and its accepted answer can apply.

In short: check how you mapped your DispatcherServlet. For your endpoint URL to be http://localhost:8080/ws the DispatcherServlet and your application contexte root should be set as "/".

It should be something like this, in your web.xml:

<servlet>
  <servlet-name>WebSocketDispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
  <servlet-name>WebSocketDispatcher</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

This or you need to include context-root and dispatcher mapping in your end-point URL:

http://<server>:<port>/<context-root>/<dispatcher-mapping>/ws

I hope it can help you.

Regards.

Heleno

于 2014-04-15T14:04:08.647 に答える