2016-04-06 5 views
0

SpringとSockJsを使用したWebSocketの設定に問題があります。SpringとSockJsのコントローラコンポーネントの問題

私はSpring Documentationのようにすべてのアプリケーションを設定していますが、接続は問題ないと思われますが、メッセージを送信するとコントローラは決して関与せず動作しません。

これは、構成成分である:

@Configuration 
@EnableWebMvc 
@EnableWebSocketMessageBroker 
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer implements WebSocketConfigurer { 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/mySocket").withSockJS().setInterceptors(new MySocketHandshakeInterceptor());; 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry registry) { 
     registry.setApplicationDestinationPrefixes("/app").enableSimpleBroker("/topic"); 
    } 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 

    } 

} 

これはHandshakeInterceptor実装である:

public class MySocketHandshakeInterceptor implements HandshakeInterceptor { 

    @Override 
    public void afterHandshake(ServerHttpRequest paramServerHttpRequest, ServerHttpResponse paramServerHttpResponse, WebSocketHandler paramWebSocketHandler, Exception paramException) { 
     // TODO Auto-generated method stub 
     System.out.println("MySocketHandshakeInterceptor afterHandshake"); 
    } 

    @Override 
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> paramMap) 
      throws Exception { 
     System.out.println("MySocketHandshakeInterceptor beforeHandshake"); 
     return true; 
    } 

} 

これにより、コントローラ・コンポーネントである:

@Controller 
public class MySocketController { 

    @MessageMapping("/testsocket") 
    @SendTo("/topic/testresponse") 
    public MessageOut test(MessageIn message) throws Exception { 
     System.out.println("MySocketController start"); 
     System.out.println("MySocketController test "+ message); 
     return new MessageOut("test OK"); 
    } 

} 

これらはMessageInとMessageOutあり:

システムでは、私ができるだけで、コンソールを

socketSession.socket.stomp.send("app/testsocket", {}, JSON.stringify({'test': 'test'})); 

アウト:これは私がソケットをテストするために起動するコマンドがある

var socketSession = {}; 

connectToMySocket(); 

function connectToVideoSocket() { 
    socketSession.socket = new SockJS("/mySocket"); 
    socketSession.socket.stomp = Stomp.over(socketSession.socket); 
    socketSession.socket.stomp.debug = null; 

    socketSession.socket.stomp.connect({}, function() { 
     socketSession.socket.stomp.subscribe("/topic/testresponse", function (data) { 
      console.log(data); 
     }); 
    }); 

} 

public class MessageIn { 

    private String test; 

    /** 
    * @return the test 
    */ 
    public String getTest() { 
     return test; 
    } 

} 


public class MessageOut { 

    private String result; 

    public MessageOut(String result) { 
     super(); 
     this.result = result; 
    } 

    /** 
    * @return the test 
    */ 
    public String getResult() { 
     return result; 
    } 

    /** 
    * @param result the result to set 
    */ 
    public void setResult(String result) { 
     this.result = result; 
    } 

} 

最後に、これはクライアント側(ジャバスクリプト)であります2行を参照してください:

MySocketHandshakeInterceptor beforeHandshake 
MySocketHandshakeInterceptor afterHandshake 

インターセプターは正常に動作しますが、私は印刷しません。コントローラコンポーネント。

どういうところが間違っていますか?おかげさまで

答えて

0

私は自分で解決しました。

これはクライアント側の問題でした。

正しいスクリプトは次のとおりです。それは正常に動作します。このように

var mySocket = undefined; 
var stompClient = undefined; 

connectToVideoSocket(); 

function connectToVideoSocket() { 
    mySocket = new SockJS('/mySocket'); 
    stompClient = Stomp.over(mySocket); 
    stompClient.debug = null; 

    stompClient.connect({}, function(frame) { 
     stompClient.subscribe('/topic/testresponse', function(data){ 
      console.log(JSON.parse(data.body).result); 
     }); 
    }); 
} 

関連する問題