为什么“'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