Spring 按参数名称自动装配对 FtpMessageHandlerSpec 不起作用

Spring autowiring by parameter name does not work for FtpMessageHandlerSpec

我无法通过使用与 bean 名称相同的 bean 名称 + 参数名称来自动装配 org.springframework.integration.ftp.dsl.FtpMessageHandlerSpec。我相信 Spring 应该能够在存在多个相同类型的 bean 时解决依赖关系,以防 bean 名称和目标参数名称相同。

我有这样的配置:

@Configuration
class cfg {

    @Bean
    Object ftpMessageHandlerSpecUser(
            FtpMessageHandlerSpec ftpMessageHandlerSpecA,
            FtpMessageHandlerSpec ftpMessageHandlerSpecB
    ) {
        return null;
    }

    @Bean
    FtpMessageHandlerSpec ftpMessageHandlerSpecA() {
        return outboundAdapter(() -> null);
    }

    @Bean
    FtpMessageHandlerSpec ftpMessageHandlerSpecB() {
        return outboundAdapter(() -> null);
    }


}

当我尝试 运行 时出现以下错误:


***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method ftpMessageHandlerSpecUser in com.example.demo.cfg required a single bean, but 2 were found:
    - &ftpMessageHandlerSpecA: defined by method 'ftpMessageHandlerSpecA' in class path resource [com/example/demo/cfg.class]
    - &ftpMessageHandlerSpecB: defined by method 'ftpMessageHandlerSpecB' in class path resource [com/example/demo/cfg.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

当我将 @Qualifier 添加到方法参数时,它起作用了:

@Configuration
class cfg {

    @Bean
    Object ftpMessageHandlerSpecUser(
            @Qualifier("ftpMessageHandlerSpecA") FtpMessageHandlerSpec ftpMessageHandlerSpecA,
            @Qualifier("ftpMessageHandlerSpecB") FtpMessageHandlerSpec ftpMessageHandlerSpecB
    ) {
        return null;
    }

    @Bean
    FtpMessageHandlerSpec ftpMessageHandlerSpecA() {
        return outboundAdapter(() -> null);
    }

    @Bean
    FtpMessageHandlerSpec ftpMessageHandlerSpecB() {
        return outboundAdapter(() -> null);
    }

}

这个有效:

@Configuration
class cfg2 {

    @Bean
    Object foo(
            String beanA,
            String beanB
    ) {
        return null;
    }

    @Bean
    String beanA() {
        return "beanA";
    }

    @Bean
    String beanB() {
        return "beanB";
    }

}

为什么它不能与 spring 集成的 FtpMessageHandlerSpec 一起使用?

DSL *Specs 是基础 SI 组件的 FactoryBeans;因此 bean 名称上的前导 &,因此您需要一个 @Qualifier.

你到底想通过注入这些来达到什么目的?它们只是集成流程的构建块。