2016-05-20 12 views
3

フロントエンドにSTOMPとSockJSを使用するSpring WebSocketsを使用します。それは罰金を働かせますが、私は別の困難があります。すべてのメッセージは、すべてのクライアントに発行されます、Spring websockets:メッセージが公開されていません

@MessageMapping("/showAccountlist") 
@SendTo("/topic/accounts") 
public Account createPublishAccount(String name) throws Exception { 

    return new Account(name); 
} 

そして、これは正常に動作し、フロントエンドのコードを、次のとおりです。

これはバックエンドのコードです。

stompClient.send("/app/showAccountlist", {}, name); 

しかし、私は

createPublishAccount("Carlos"); 

が公開されないメッセージのように思えるメソッド名で、私のJavaのバックエンドからバックエンドの私の方法を呼び出すとき。どんな解決策ですか?または、これは動作する方法ではなく、SockJS経由でトリガされた場合にのみ動作します。それは@SendToアノテーション付きメソッドを呼び出すことによって、メッセージを送信することは不可能だよう

@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("/showAccountlist").withSockJS(); 
} 

}

+0

は春でインスタンス化さcreatePublishAccountメソッドを持つクラスですか? –

+1

@SendTo注釈付きメソッドを呼び出すことでメッセージを送信できないようです。 'SimpMessagingTemplate'を使って動作しますか? –

+0

確かに。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-handle-send –

答えて

1

それはそうです:

は、これは私のWebConfigです。

春にメッセージを送信する方法は、SimpMessagingTemplateを使用することです。例えば、convertAndSendToUserメソッド(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessagingTemplate.html)のように、引数として(あなたの場合は/topic/accounts)指定することができます。

春のドキュメント (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-handle-send)からの抜粋を参照してください。

は、アプリケーションのどの部分から接続しているクライアントにメッセージを送信したい場合はどう?どのアプリケーションコンポーネントも "brokerChannel"にメッセージを送信できます。これを行う最も簡単な方法は、SimpMessagingTemplateを注入してメッセージを送信することです。通常、例えば、タイプによって注入持つことが容易であるべきである:

@Controller 
public class GreetingController { 

    private SimpMessagingTemplate template; 

    @Autowired 
    public GreetingController(SimpMessagingTemplate template) { 
     this.template = template; 
    } 

    @RequestMapping(path="/greetings", method=POST) 
    public void greet(String greeting) { 
     String text = "[" + getTimestamp() + "]:" + greeting; 
     this.template.convertAndSend("/topic/greetings", text); 
    } 

} 
+0

ありがとう、賞金はまた20時間で受け入れられます。私はここに質問がある。メソッド "convertAndSend"はパラメータ "user"を受け取り、特定のユーザにメッセージを送信します。これを使用する方法を理解できませんでした。ここのユーザーは何ですか?特定のアカウントがお金を受け取った場合、クライアント側の残高情報を更新する必要があります。 – Spring

+0

これは、春のセキュリティのプリンシパル名に適用されます。詳細については、http://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html#websocket-authenticationを参照してください。だから春は、キュー名とプリンシパル名に基づいて特定のキュー名に変換し、メッセージは特定のユーザーに配信されます。 –

+0

私のアプリは認証を使用しませんが、この場合でも春のセキュリティを使用できますか? WebSocket接続が確立されるたびに、クライアント側でランダムなユーザ名を生成する必要がありますか? – Spring

関連する問題