2014-04-08 14 views
12

Ich konfiguriere Websockets in Spring grundsätzlich durch Befolgen der Anleitung in der Dokumentation.Konnte nicht automatisch starten. Keine Beans vom SimpMessagingTemplate-Typ gefunden

Ich versuche zur Zeit eine Nachricht vom Server an den Client gesendet werden, wie im Abschnitt „Sending messages from anywhere

Nach dem Beispiel erklärt, eine Klasse SimpMessagingTemplate

@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); 
    } 

} 

jedoch genannt Autowire kann, Mein aktuelles Projekt kann die Bean "SimpMessagingTemplate" nicht finden. (Intellij: ‚kann nicht autowire Keine Bohnen von SimpMessagingTemplate gefunden Typ‘

prüfe ich habe mehrere Beispiele im Internet, aber ich kann nicht finden, wie Spring bekommt eine Instanz von SimpMessagingTemplate erstellen Wie kann ich es Autowire

..?

EDIT:.

ich beschlossen, etwas mehr Hintergrundinformationen senden Dies ist meine aktuelle websocket Konfiguration:

<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 arbeitet mit t seine Controller

@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() + "!"); 
    } 
} 

ich nicht nur sicher, wie diese Arbeit zu machen

public class SessionController { 

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

    private SimpMessagingTemplate template; 

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

} 

Als bean "SimpMessagingTemplate Vorlage" nicht gefunden wird. Die Frühjahrsdokumentation bietet hierzu keine weiteren Details.

EDIT: Beispiel für funktionierenden Code in github

Antwort

6

Seltsam, denn wenn Sie den Namespace websocket verwenden, verursacht das Element "message-broker" die Erstellung einer Bean SimpMessagingTemplate, die Ihnen dann zur Verfügung stehen sollte. Sind sowohl der Controller als auch der websocket-Namespace im selben ApplicationContext oder ist vielleicht einer im "root" -Kontext und der andere im DispatcherServlet-Kontext?

+1

Vielen Dank für Ihre Hilfe. Ich habe das Problem gefunden. Ich schrieb einen [Beweis des Codes] (https://github.com/tk421/spring-stomp) und dann merke ich, dass das Problem ist, dass Intellij das @Autowire für SimpMessagingTemplate nicht richtig aufnimmt. Wenn Sie das Programm jetzt ausführen, funktioniert es gut. – Tk421

+1

Konnten Sie das Problem lösen? – plkmthr

+1

@plkmthr Das Problem ist, dass Intelli SimpMessagingTemplate nicht richtig abruft. Wenn Sie es ausführen, wird es funktionieren. Überprüfen Sie den Link zum "Proof of code" – Tk421

6

Sie müssen entweder eine Bohne-Definition-ID mit dem gleichen Namen wie Klassennamen in Ihrem application xml oder @Component mit Anmerkungen versehen Klasse für Autowire auf Injektion

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

Sie müssen möglicherweise unter Tag definieren, um Ihr Paket zeigen für die späteren Fall

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

Bitte beachten Sie, dass SimpMessagingTemplate nicht meine Klasse ist Teil des Spring Framework. Die Dokumentation enthält keine weiteren Informationen darüber, wie eine Instanz dieser Klasse abgerufen werden kann. Wenn ich versuche, die Bean in meinem XML wie erwartet einen Parameter im Konstruktor (MessageChannel-Schnittstelle), die ich nicht bin Sicher, wie Sie mit der aktuellen Websocket-Konfiguration verknüpfen. – Tk421

+0

Weitere Informationen zur ursprünglichen Frage hinzugefügt. – Tk421

+0

Ich habe mehr Fragen zu diesem Thema. http://stackoverflow.com/questions/23026408/how-to-use-executorsubscribablechannel – Tk421

1

Rossen hatte Recht. Durch das Hinzufügen des Elements wird die SimpMessagingTemplate-Bean zum Kontext für die Injektion hinzugefügt. Dies muss im Stammkontext der Webanwendung sein, nicht im Kontext für Spring DispatchServlet. In der folgenden Datei web.xml sollte das Nachrichtenbrokerelement in der Datei app-root.xml enthalten sein. Wenn Sie nur in app-mvc.xml einfügen, wird NoSuchBeanDefinitionException ausgelöst.

<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> 
6

ich das gleiche Problem hatte, trat der Fehler, weil meine websocket Konfigurationsdatei:

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

} 

nicht durch Feder gescannt wurde.

so die Lösung bestand darin, das Paket mit dieser Konfigurationsdatei zu den gescannten Paketen hinzuzufügen.