2016-05-18 8 views
2

XMLを使用して設定されたSpring MVCアプリケーションにSTOMPを使用してWebSocketサポートを追加しようとしています。これまでのところ、これは本当にうまくいっています。私はWebSocketsサーバーのリスニングを手に入れました。そしてstomp.jsはそれに接続してメッセージを送信し、応答を受け取ることができます。Spring WebSockets XML設定でbrokerMessagingTemplateが提供されない

私がまだ取り組まなかったのは、サーバーがクライアントから受信したメッセージに応答しない任意のメッセージをクライアントに送信するサポートです。つまりこれはこれまでのRESTのほんの複雑なバージョンであり、それほど有用ではありません。

マイXMLの設定は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:websocket="http://www.springframework.org/schema/websocket" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd"> 

    <websocket:message-broker> 
    <websocket:stomp-endpoint path="/api/websocket/stomp" allowed-origins="*"> 
    </websocket:stomp-endpoint> 

    <websocket:simple-broker prefix="/topic,/queue" /> 

    <websocket:message-converters> 
     <bean class="org.springframework.messaging.converter.MappingJackson2MessageConverter"> 
      <property name="objectMapper" ref="objectMapper" /> 
     </bean> 
    </websocket:message-converters> 
    </websocket:message-broker> 

    <bean class="uk.co.grahamcox.webapp.DebugController"> 
    <constructor-arg name="clock" ref="clock" /> 
    <constructor-arg name="template" ref="brokerMessagingTemplate" /> 
    </bean> 
</beans> 

(DebugControllerはRESTとWSハンドラの両方として正常に動作し、サーバの時刻を返すように、単一のメソッドを持つクラスである)

そして、

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'brokerMessagingTemplate' is defined 

イライラする事はのIntelliJ私にとって「brokerMessagingTemplate」の参照を自動的に完了したことである、と私は@Bean definにそれをクリックスルーすることができます:起動時に私が取得しますAbstractMessageBrokerConfigurationの中にあります。

私は、この作業を行うためにXMLの設定をいくつか欠落していると思いますが、ドキュメントではこれが何であるかを知ることはできません。

提案がありますか? は、クライアントから受け取った1への応答ではないことを、クライアントに任意のメッセージを送信するサーバーの

答えて

1

サポート。

メッセージをクライアントに送信する1つの方法は、トピックにサブスクライブすることです。「アプリケーションの宛先プレフィックス」と「ブローカープレフィックス」の違いを理解してください。この特定のケースでは、クライアントがブローカーの宛先にサブスクライブするようにしてから、いつでもすべてのクライアントにメッセージを送信できます。

これを理解する最も良い方法は、flow of messages in the reference documentationをチェックすることです。

これらのメッセージを送信するには、アプリケーションコードにメッセージングテンプレートが必要です。

フォームBeanの名前を実際のBeanのタイプに切り替えることで、コード例を修正できます。

<bean class="uk.co.grahamcox.webapp.DebugController"> 
    <constructor-arg name="clock" ref="clock" /> 
    <constructor-arg name="template" class="org.springframework.messaging.simp.SimpMessagingTemplate" /> 
    </bean> 
reference documentation mentions that bean name

が、XML構成を使用する場合、それがこの名前で登録されていないようです。これを改善するためにJIRA issueを自由に作成してください。

+0

これは主に動作します。型によるコンストラクタ-argは、厄介なことではありません - クラスは有効な属性ではありませんが、クラス内のプロパティをautowiringするとうまくいきました。 – Graham

+0

どのようにしてXMLの設定が決定しますか? REBOOKMessagingTemplateを持つBeanが 'AbstractMessageBrokerConfiguration'で定義された、その型の特定のインスタンスである場合、単に型の名前を指定するのはなぜですか? – jordanpg

+0

私はあなたの質問を理解していません。 javaconfigとxml configの間に矛盾がある場合は、このためのstackoverflowに関する具体的な質問を作成するか、jira.spring.ioに問題を作成してください。 –

関連する問題