2016-06-05 11 views
0

Ich gehe durch die Websockets mit Spring 4-Lernprogramm here. Ich habe es funktioniert, wo der Server reagiert, wenn der Client anruft.Fehler beim Starten der 'subProtocolWebSocketHandler'-Bean-Ausnahme beim Versuch, Websockets zu implementieren

Allerdings ist mein Anwendungsfall, den Server Push die Nachrichten ohne Client muss anrufen. Also habe ich online nach Möglichkeiten gesucht, das zu tun und stieß auf eine fewpoststhat sagte, dass ich etwas namens SimpMessagingTemplate verwenden musste. Also habe ich den Code geändert, um die SimpMessagingTemplate zu verwenden.

Jetzt bekomme ich diese Ausnahme in der Server-Konsole:

04-Jun-2016 22:49:24.093 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed 
org.springframework.context.ApplicationContextException: Failed to start bean 'subProtocolWebSocketHandler'; nested exception is java.lang.IllegalArgumentException: No handlers 
     at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176) 
     at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:51) 
     at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:346) 
     at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149) 
     at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112) 
     at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:852) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 
     at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3827) 
     at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:291) 
     at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5608) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
     at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalArgumentException: No handlers 
     at org.springframework.util.Assert.isTrue(Assert.java:68) 
     at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.start(SubProtocolWebSocketHandler.java:251) 
     at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173) 
     ... 20 more 

Ich fand this post und this post mit dem gleichen Problem, aber keiner von ihnen hat eine echte Lösung geschrieben.

Mein websocket Controller:

@Controller 
public class WebSockController { 

    private SimpMessagingTemplate template; 

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

    @MessageMapping("/hello")  
    public void greeting(GreetingsFromClient message) throws Exception { 
     String[] messages = {"message1","message2","message3","message4","message5"}; 
     for(int i=0 ; i<messages.length ; i++){ 
      Thread.sleep(3000); // simulated delay 
      this.template.convertAndSend("/topic/greetings", new GreetingsFromServer("Hello, " + messages[i] + "!")); 
     }   
    } 
} 

Meine websocket config:

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/topic"); 
     config.setApplicationDestinationPrefixes("/app"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/hello").withSockJS(); 
    } 

    @Override 
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void configureClientInboundChannel(ChannelRegistration arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void configureClientOutboundChannel(ChannelRegistration arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean configureMessageConverters(List<MessageConverter> arg0) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public void configureWebSocketTransport(WebSocketTransportRegistration arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

Auch hatte ich org.springframework.web.socket.config Komponente Scan hinzugefügt werden, da ohne diese würde ich ein Auto-Verkabelung Ausnahme erhalten (ref).

Ich bin mit Spring 4.2.5 und Tomcat 8.

Jede Hilfe sehr geschätzt wird. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Danke.

Antwort

0

Nachdem ich einige Stunden mit diesem Problem zu kämpfen hatte, löste ich das, indem ich die Websocket-Konfiguration zur rootconfig hinzufügte.

@Configuration 
@ComponentScan({ "xxxxxx.xxxxxxxxx.controllers" }) 
@Import({SecurityConfig.class, WebSocketConfig.class, HibernateConfig.class}) 
public class RootConfig { 

} 

Meine Anwendung Initialisierer, der die Root-Konfiguration verwendet.

public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { RootConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] { AppConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
} 
Verwandte Themen