2014-04-08 22 views
12

Konfiguruję Websockets na wiosnę, wykonując instrukcje zawarte w dokumentacji.Nie można autowirować. Nie znaleziono fasoli typu SimpMessagingTemplate.

Obecnie próbuję wysłać wiadomość od serwera do klienta w sposób opisany w sekcji „Sending messages from anywhere

Wzorem można Autowire klasy o nazwie 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); 
    } 

} 

jednak mój obecny projekt nie może znaleźć fasoli "SimpMessagingTemplate". (Intellij: „Nie można autowire Brak fasola typu SimpMessagingTemplate znaleziono”

Muszę sprawdzić kilka przykładów w Internecie, ale nie mogę znaleźć sposobu, aby dostać Wiosna aby utworzyć wystąpienie SimpMessagingTemplate Jak mogę Autowire go

..?

EDIT:.

postanowiłem wysłać trochę więcej informacji tła to jest moja obecna konfiguracja 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 współpracuje z T jego kontroler

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

ja po prostu nie wiem, jak do tej pracy

public class SessionController { 

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

    private SimpMessagingTemplate template; 

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

} 

Jako fasoli „SimpMessagingTemplate szablonu” nie została znaleziona. Dokumentacja wiosna nie zawiera więcej szczegółów dotyczących tej kwestii.

EDIT: Przykład kodu pracującego w github

Odpowiedz

6

Dziwne, ponieważ podczas korzystania z przestrzeni nazw websocket element "message-broker" powoduje utworzenie komponentu bean SimpMessagingTemplate, który powinien być następnie dostępny do wstrzykiwania. Czy zarówno kontroler, jak i przestrzeń przestrzeni websocket w tym samym kontekscie aplikacji lub jest prawdopodobnie jednym z kontekstu "root", a drugi w kontekście DispatcherServlet?

+1

Dzięki za pomoc. Znalazłem problem. Napisałem [dowód kodu] (https://github.com/tk421/spring-stomp), a następnie zdaję sobie sprawę, że problem polega na tym, że Intellij nie zbiera prawidłowo @Autowire for SimpMessagingTemplate. Jeśli uruchomisz teraz program, działa dobrze. – Tk421

+1

Czy byłeś w stanie rozwiązać problem? – plkmthr

+1

@plkmthr Problem polega na tym, że Intellij nie pobiera poprawnie SimpMessagingTemplate. Jeśli go uruchomisz, zadziała. Sprawdź link do "dowodu kodu" – Tk421

6

Będziecie też mieć identyfikator definicji fasoli o takiej samej nazwie jak nazwa klasy w ApplicationContext XML lub adnotacje @Component na wstrzykiwanie klasę dla Autowire pracować

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

może trzeba określić poniżej znacznika wskazującego do pakietu dla późniejszego przypadku

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

Należy pamiętać, że SimpMessagingTemplate nie jest moją klasą jest częścią Spring Framework. Dokumentacja nie zawiera więcej informacji o tym, jak uzyskać instancję tej klasy. Jeśli spróbuję dodać komponent bean w moim XML, tak jak oczekuje parametru w konstruktorze (interfejs MessageChannel), którego nie jestem upewnij się, jak połączyć się z bieżącą konfiguracją websocket. – Tk421

+0

Dodano więcej informacji na oryginalne pytanie. – Tk421

+0

Mam więcej pytań związanych z tym problemem. http://stackoverflow.com/questions/23026408/how-to-use-executorsubscribablechannel – Tk421

1

Rossen był poprawny. Dodanie elementu spowoduje dodanie komponentu bean SimpMessagingTemplate do kontekstu dla wtrysku. Musi to być kontekst główny aplikacji internetowej, a nie kontekst dla Spring DispatchServlet. Np. W następującym pliku web.xml element message-broker powinien być zawarty w pliku app-root.xml. Włączenie tylko w app-mvc.xml spowoduje wyjątek 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

miałem ten sam problem wystąpił błąd, ponieważ mój websocket plik konfiguracyjny:

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

} 

nie został zeskanowany wiosny.

, więc poprawka polegała na dodaniu pakietu z tym plikiem konfiguracyjnym do zeskanowanych pakietów.