2017-04-07 104 views
1

我想创建一个websocket拦截器,它使用来自Spring云流的MessageChannel发送消息。我面临的一个依赖循环春季WebSocket拦截器和弹簧云流的依赖周期

┌─────┐ 
| myChannelInterceptor defined in file [/Users/shahbour/IdeaProjects/proxy/target/classes/com/xxxxx/proxy/broker/MyChannelInterceptor.class] 
↑  ↓ 
| com.xxxx.proxy.service.XxxxxBinding (field private java.util.Map org.springframework.cloud.stream.binding.BindableProxyFactory.bindingTargetFactories) 
↑  ↓ 
| org.springframework.cloud.stream.config.BindingServiceConfiguration (field private java.util.List org.springframework.cloud.stream.config.BindingServiceConfiguration.customMessageConverters) 
↑  ↓ 
| org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration 
↑  ↓ 
| webSocketConfig defined in file [/Users/shahbour/IdeaProjects/proxy/target/classes/com/xxxx/proxy/config/WebSocketConfig.class] 
└─────┘ 

我的问题是,我需要注入MessageChannel到WebSocket的拦截

我收到以下错误,如果我使用@Autowire

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:178) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:167) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:151) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:114) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:879) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at com.xxxx.proxy.xxxxxxProxyApplication.main(XxxxxProxyApplication.java:29) [classes/:na] 
Caused by: java.lang.IllegalArgumentException: No handlers 
    at org.springframework.util.Assert.isTrue(Assert.java:92) ~[spring-core-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.start(SubProtocolWebSocketHandler.java:244) ~[spring-websocket-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:175) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    ... 15 common frames omitted 
+0

请分享你的'interceptor'和'WebSocketConfig' –

+0

我创建了一个[示例项目](https://github.com/shahbour/stream-websocket) – Shahbour

+0

好的,谢谢!请添加一些描述如何重现和'ChannelInterceptor'定义。现在没有什么可玩 –

回答

1

OK 。谢谢!不,我看到了问题。

看:

  • MyChannelInterceptor取决于由BinderService自动创建的通道上。
  • 那一个试图从应用程序上下文中推断MessageConverter
  • AbstractMessageBrokerConfiguration提供了由@EnableWebSocketMessageBroker
  • ,反过来,会扫描你的WebSocketConfig因为AbstractWebSocketMessageBrokerConfigurer
  • 而这最后一个希望你MyChannelInterceptor被注入一个在CompositeMessageConverter brokerMessageConverter
  • 那类被实例化的脸。

不知道如何解决,作为外的现成的功能,但这里是某种变通方法:

public class MyChannelInterceptor extends ChannelInterceptorAdapter { 

    @Autowired 
    private MessageChannel output; 

@Configuration 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Bean 
    public MyChannelInterceptor myChannelInterceptor() { 
     return new MyChannelInterceptor(); 
    } 
... 
@Override 
public void configureClientInboundChannel(ChannelRegistration registration) { 
    registration.setInterceptors(myChannelInterceptor()); 
} 
+0

我正在使用'ApplicationContextAware'来打破这个循环,我尝试了你的建议,它完美地工作 – Shahbour