web-dev-qa-db-ja.com

自動配線できませんでした。 SimpMessagingTemplateタイプのBeanが見つかりません

私は、基本的にドキュメントで提供されているガイドに従って、SpringでWebSocketを構成しています。

どこからでもメッセージを送信する 」で説明されているように、現在サーバーからクライアントにメッセージを送信しようとしています。

例に続いて、SimpMessagingTemplateというクラスをAutowireできます。

@Controller
public class GreetingController {

    private SimpMessagingTemplate template;

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

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

}

しかし、私の現在のプロジェクトでは、「SimpMessagingTemplate」というBeanを見つけることができません。 (Intellij: '自動配線できませんでした。SimpMessagingTemplateタイプのBeanが見つかりませんでした。'.

インターネットでいくつかの例を確認しましたが、SpringにSimpMessagingTemplateのインスタンスを作成する方法を見つけることができません。どうすれば自動配線できますか?

編集:

さらにいくつかの背景情報を送信することにしました。これは私の現在のWebSocket構成です:

<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-4.0.xsd">

        <!-- TODO properties to be read from a properties file -->
        <websocket:message-broker application-destination-prefix="/app">
            <websocket:stomp-endpoint path="/new_session" >
                <websocket:sockjs/>
            </websocket:stomp-endpoint>
            <websocket:simple-broker prefix="/topic"/>
        </websocket:message-broker>
</beans>

Websocketはこのコントローラーで動作します

@Controller
public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    @MessageMapping("/new_session")
    @SendTo("/topic/session")
    public SessionStatus newSession(Session session) throws Exception {
    Thread.sleep(3000); // simulated delay
    log.info("Response sent !!");
    return new SessionStatus("StatusReport, " + session.toString() + "!");
    }
}

この作品をどうやって作ればいいのかわからない

public class SessionController {

    private static final Logger log = LoggerFactory.getLogger(SessionController.class);

    private SimpMessagingTemplate template;

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

}

Bean「SimpMessagingTemplate template」が見つからないため。 Springのドキュメントには、この問題に関する詳細は記載されていません。

[〜#〜] edit [〜#〜]github の作業コードの例

16
Tk421

奇妙なことに、websocket名前空間を使用すると、「message-broker」要素がSimpMessagingTemplate Beanを作成するため、これを注入できるようになります。コントローラとwebsocket名前空間の両方が同じApplicationContextにありますか、それとも「ルート」コンテキストにあり、もう1つはDispatcherServletコンテキストにありますか?

6

私は同じ問題を抱えていました、私のWebsocket設定ファイルが原因でエラーが発生しました:

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

}

春までにスキャンされませんでした。

修正は、この構成ファイルを含むパッケージをスキャンしたパッケージに追加することでした。

10
Urbanleg

ApplicationContext xmlのクラス名と同じ名前のBean定義IDを持っているか、Autowireが機能するようにクラスの注入時に@Componentに注釈を付けます

<bean id="SimpMessagingTemplate " class="your-class" >

後のケースのために、パッケージを指すタグを以下に定義する必要があるかもしれません

<context:component-scan base-package="com.x.y"/>
6
earthling

ロッセンは正しかった。要素を追加すると、SimpMessagingTemplate Beanが注入のコンテキストに追加されます。これは、Spring DispatchServletのコンテキストではなく、Webアプリのルートコンテキストにある必要があります。たとえば、次のweb.xmlファイルでは、message-broker要素をapp-root.xmlファイルに含める必要があります。 app-mvc.xmlにのみ含めると、NoSuchBeanDefinitionExceptionが発生します。

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/app-root.xml</param-value>
</context-param>

<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/app-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
1
raymond