2014-04-08 20 views
12

Sto configurando Websockets in primavera fondamentalmente seguendo la guida fornita nella documentazione.Impossibile eseguire l'autowire. Nessun bean di tipo SimpMessagingTemplate trovato

Attualmente sto cercando di inviare un messaggio dal server al client come spiegato nella sezione "Sending messages from anywhere"

Seguendo l'esempio, è possibile Autowire una classe denominata 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); 
    } 

} 

Tuttavia, il mio progetto attuale non riesce a trovare il bean "SimpMessagingTemplate". (Intellij: 'Impossibile autowire Nessun fagioli di tipo SimpMessagingTemplate trovato'

Ho controllo diversi esempi in internet, ma non riesco a trovare come raggiungere primavera per creare un'istanza di SimpMessagingTemplate Come posso Autowire che

..?

EDIT:.

ho deciso di inviare alcune ulteriori informazioni di questo è il mio attuale configurazione 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 lavora con t il suo controllore

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

io proprio non sicuro di come fare questo lavoro

public class SessionController { 

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

    private SimpMessagingTemplate template; 

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

} 

Come il fagiolo "modello SimpMessagingTemplate" non si trova. La documentazione Spring non offre ulteriori dettagli in merito.

EDIT: Esempio di codice funzionante in github

risposta

6

Strano, perché quando si utilizza lo spazio dei nomi websocket, l'elemento "message-broker" causa la creazione di un bean SimpMessagingTemplate che dovrebbe quindi essere disponibile per l'iniezione. Sono entrambi il controller e lo spazio dei nomi websocket nello stesso ApplicationContext o forse uno nel contesto "root" e l'altro nel contesto DispatcherServlet?

+1

Grazie per il vostro aiuto. Ho trovato il problema. Ho scritto una [prova del codice] (https://github.com/tk421/spring-stomp) e poi mi rendo conto che il problema è che Intellij non sta raccogliendo correttamente @Autowire per SimpMessagingTemplate. Se esegui il programma ora funziona perfettamente. – Tk421

+1

Sei riuscito a risolvere il problema? – plkmthr

+1

@plkmthr Il problema è che Intellij non rileva correttamente SimpMessagingTemplate. Se lo corri funzionerà. Controlla il link alla "prova di codice" – Tk421

6

Si deve neanche avere un id definizione di fagioli con stesso nome di nome di classe nel vostro XML applicationContext o annotare @Component su iniezione di classe per Autowire lavorare

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

potrebbe essere necessario definire sotto tag che puntano al tuo pacchetto per caso in seguito

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

Si prega di notare che SimpMessagingTemplate non è la mia classe fa parte del Framework di primavera. La documentazione non fornisce ulteriori informazioni su come ottenere un'istanza di quella classe. Se provo ad aggiungere il bean nel mio XML come è in attesa di un parametro nel costruttore (interfaccia MessageChannel) che non sono sicuro come collegare alla configurazione corrente di websocket. – Tk421

+0

Aggiunte ulteriori informazioni alla domanda originale. – Tk421

+0

Ho più domande relative a questo problema. http://stackoverflow.com/questions/23026408/how-to-use-executorsubscribablechannel – Tk421

1

Rossen aveva ragione. L'aggiunta dell'elemento aggiungerà il bean SimpMessagingTemplate al contesto per l'iniezione. Questo deve essere nel contesto radice dell'app Web, non nel contesto di Spring DispatchServlet. Ad esempio, nel seguente file web.xml, l'elemento message-broker dovrebbe essere incluso nel file app-root.xml. Includere solo in app-mvc.xml causerà 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> 
6

Ho avuto lo stesso problema, si è verificato l'errore, perché il mio websocket file di configurazione:

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

} 

non è stato scansionato entro la primavera.

quindi la soluzione era aggiungere il pacchetto con questo file di configurazione ai pacchetti scansionati.

Problemi correlati