Spring 集成 websocket 抛出“需要 'outputChannel' 或 'outputChannelName'” 异常
Spring integration websocket throws " 'outputChannel' or 'outputChannelName' is required " Exception
我是 Spring 集成框架的新手。
虽然 运行 spring 集成 websocket 示例 code 我得到
'outputChannel' 或 'outputChannelName' 是必需的 例外。
我是不是漏掉了什么?
以下是我的代码,
@Configuration
@ComponentScan
@EnableAutoConfiguration
@RestController
public class Application {
public static void main(String args[]) throws Throwable {
SpringApplication.run(Application.class, args);
}
@Bean
ServerWebSocketContainer serverWebSocketContainer() {
return new ServerWebSocketContainer("/names").withSockJs();
}
@Bean
MessageHandler webSocketOutboundAdapter() {
return new WebSocketOutboundMessageHandler(serverWebSocketContainer());
}
@Bean(name = "webSocketFlow.input")
MessageChannel requestChannel() {
return new DirectChannel();
}
@Bean
IntegrationFlow webSocketFlow() {
return f -> {
Function<Message, Object> splitter = m -> serverWebSocketContainer().getSessions().keySet().stream()
.map(s -> MessageBuilder.fromMessage(m).setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, s).build()).collect(Collectors.toList());
f.split(Message.class, splitter).channel(c -> c.executor(Executors.newCachedThreadPool())).handle(webSocketOutboundAdapter());
};
}
@RequestMapping("/hi/{name}")
public void send(@PathVariable String name) {
requestChannel().send(MessageBuilder.withPayload(name).build());
}
}
异常堆栈,
java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:781)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153)
注意 - MessageProducerSupport
。您的代码没有显示任何类型的内容,因此您只是在我们的应用程序中隐藏了一些内容。
我猜你可能有类似的东西:
@Bean
public WebSocketInboundChannelAdapter webSocketInboundChannelAdapter() {
...
}
而且这个必须用 setOutputChannel()
声明。
或者,如果您将它用作 Java DSL 的起点 - IntegrationFlows.from(webSocketInboundChannelAdapter())
,则不要使用 @Bean
声明它。之后框架会为您进行正确的配置和注册。
我是 Spring 集成框架的新手。 虽然 运行 spring 集成 websocket 示例 code 我得到 'outputChannel' 或 'outputChannelName' 是必需的 例外。
我是不是漏掉了什么?
以下是我的代码,
@Configuration
@ComponentScan
@EnableAutoConfiguration
@RestController
public class Application {
public static void main(String args[]) throws Throwable {
SpringApplication.run(Application.class, args);
}
@Bean
ServerWebSocketContainer serverWebSocketContainer() {
return new ServerWebSocketContainer("/names").withSockJs();
}
@Bean
MessageHandler webSocketOutboundAdapter() {
return new WebSocketOutboundMessageHandler(serverWebSocketContainer());
}
@Bean(name = "webSocketFlow.input")
MessageChannel requestChannel() {
return new DirectChannel();
}
@Bean
IntegrationFlow webSocketFlow() {
return f -> {
Function<Message, Object> splitter = m -> serverWebSocketContainer().getSessions().keySet().stream()
.map(s -> MessageBuilder.fromMessage(m).setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, s).build()).collect(Collectors.toList());
f.split(Message.class, splitter).channel(c -> c.executor(Executors.newCachedThreadPool())).handle(webSocketOutboundAdapter());
};
}
@RequestMapping("/hi/{name}")
public void send(@PathVariable String name) {
requestChannel().send(MessageBuilder.withPayload(name).build());
}
}
异常堆栈,
java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:781)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153)
注意 - MessageProducerSupport
。您的代码没有显示任何类型的内容,因此您只是在我们的应用程序中隐藏了一些内容。
我猜你可能有类似的东西:
@Bean
public WebSocketInboundChannelAdapter webSocketInboundChannelAdapter() {
...
}
而且这个必须用 setOutputChannel()
声明。
或者,如果您将它用作 Java DSL 的起点 - IntegrationFlows.from(webSocketInboundChannelAdapter())
,则不要使用 @Bean
声明它。之后框架会为您进行正确的配置和注册。