为什么“'outputChannel' or 'outputChannelName' is required”的异常可以通过在测试时添加@SpringBootApplication来解决
Why exception of "'outputChannel' or 'outputChannelName' is required" can be resovled by adding @SpringBootApplication when testing
我定义了一个入站IntegrationFlow
,它将从MQTT代理获取消息并将它们路由到一些通道,代码如下:
@Configuration
@AllArgsConstructor
public class MqttInboundProcess {
private final MqttPahoMessageDrivenChannelAdapter inboundAdapter;
@Bean
public IntegrationFlow mqttInbound() {
return IntegrationFlows.from(inboundAdapter)
.transform(new PojoTransformer())
.<Data, String>route(Data::getType,
m -> m.prefix("Channel.")
.resolutionRequired(false)
.defaultOutputChannel("TypeUnknown"))
.get();
}
}
我试图在测试中定义一个新的 MqttPahoMessageDrivenChannelAdapter
实例,例如:
@SpringBootTest
@RunWith(SpringRunner.class)
@DirtiesContext
public class MqttInboundProcessTest {
//Some tests here
@Configuration
public static class MqttContext {
@Bean
public MqttPahoMessageDrivenChannelAdapter inbound() {
DefaultMqttPahoClientFactory pahoClientFactory = new DefaultMqttPahoClientFactory();
MqttConnectOptions connectionOptions = new MqttConnectOptions();
connectionOptions.setServerURIs(new String[] { "tcp://localhost:1883" });
pahoClientFactory.setConnectionOptions(connectionOptions);
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("testIn", pahoClientFactory, "testTopic");
adapter.setCompletionTimeout(5000);
adapter.setQos(1);
return adapter;
}
}
}
然后,发生异常java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
。但是,如果我将注释从 @Configuration
更改为 @SpringBootApplication
,一切正常。我真的不知道案例中两个注释之间的区别。或者,我可以知道除了 @Configuration
之外还有其他必要的注释来使测试工作吗?
那是因为 Spring 集成基础架构只有在您拥有真正与 Spring 启动自动配置一起使用的 @EnableIntegration
时才会激活。在此处查看更多信息:https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#configuration-enable-integration
我定义了一个入站IntegrationFlow
,它将从MQTT代理获取消息并将它们路由到一些通道,代码如下:
@Configuration
@AllArgsConstructor
public class MqttInboundProcess {
private final MqttPahoMessageDrivenChannelAdapter inboundAdapter;
@Bean
public IntegrationFlow mqttInbound() {
return IntegrationFlows.from(inboundAdapter)
.transform(new PojoTransformer())
.<Data, String>route(Data::getType,
m -> m.prefix("Channel.")
.resolutionRequired(false)
.defaultOutputChannel("TypeUnknown"))
.get();
}
}
我试图在测试中定义一个新的 MqttPahoMessageDrivenChannelAdapter
实例,例如:
@SpringBootTest
@RunWith(SpringRunner.class)
@DirtiesContext
public class MqttInboundProcessTest {
//Some tests here
@Configuration
public static class MqttContext {
@Bean
public MqttPahoMessageDrivenChannelAdapter inbound() {
DefaultMqttPahoClientFactory pahoClientFactory = new DefaultMqttPahoClientFactory();
MqttConnectOptions connectionOptions = new MqttConnectOptions();
connectionOptions.setServerURIs(new String[] { "tcp://localhost:1883" });
pahoClientFactory.setConnectionOptions(connectionOptions);
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("testIn", pahoClientFactory, "testTopic");
adapter.setCompletionTimeout(5000);
adapter.setQos(1);
return adapter;
}
}
}
然后,发生异常java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required
。但是,如果我将注释从 @Configuration
更改为 @SpringBootApplication
,一切正常。我真的不知道案例中两个注释之间的区别。或者,我可以知道除了 @Configuration
之外还有其他必要的注释来使测试工作吗?
那是因为 Spring 集成基础架构只有在您拥有真正与 Spring 启动自动配置一起使用的 @EnableIntegration
时才会激活。在此处查看更多信息:https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#configuration-enable-integration