Spring-электропроводка по имени параметра не работает для FtpMessageHandlerSpec - PullRequest
0 голосов
/ 17 января 2020

Я не могу автоматически подключить org.springframework.integration.ftp.dsl.FtpMessageHandlerSpe c, используя имя компонента + имя параметра, совпадающее с именем компонента. Я считаю, что Spring должен иметь возможность разрешать зависимости, когда существует несколько бинов одного типа в случае, если имя бина и имя целевого параметра совпадают.

У меня есть такая конфигурация:

@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";
    }

}

Почему он не работает с FtpMessageHandlerSpe c из весенней интеграции?

1 Ответ

0 голосов
/ 17 января 2020

DSL *Spec s FactoryBean s для базовых компонентов SI; отсюда ведущий & в имени бина, поэтому вам нужен @Qualifier.

Что именно вы пытаетесь достичь, вводя их в любом случае? Они являются просто строительными блоками для интеграционных потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...