2016-11-07 2 views
3

Я получаю следующее сообщение об ошибке при попытке autowire два бобов не используяNoUniqueBeanDefinitionException весной аннотация привод конфигурации

Нет квалификационную боба типа [javax.jms.ConnectionFactory] определяются: ожидается совпадение одного боб, но нашел 2: aConnectionFactory, bConnectionFactory

Description: 

Parameter 1 of method jmsListenerContainerFactory in org.springframework.boot.autoconfigure.jms.JmsAnnotationDrivenConfiguration required a single bean, but 2 were found: 
     - aConnectionFactory: defined by method 'aConnectionFactory' in package.Application 
     - bConnectionFactory: defined by method 'bConnectionFactory' in package.Application 


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 

Я эта аннотацией привода конфигурация:

@SpringBootApplication 
@EnableIntegration 
@IntegrationComponentScan 
public class Application extends SpringBootServletInitializer implements 
WebApplicationInitializer { 

    @Resource(name = "aConnectionFactory") 
    private ConnectionFactory aConnectionFactory; 

    @Resource(name = "bConnectionFactory") 
    private ConnectionFactory bConnectionFactory; 

    @Bean 
    public IntegrationFlow jmsInboundFlow() { 
     return IntegrationFlows 
        .from(
         Jms.inboundAdapter(aConnectionFactory) 
              .destination(aQueue), 
         e -> e.poller(Pollers.fixedRate(100, 
TimeUnit.MILLISECONDS).maxMessagesPerPoll(100)) 
        ).channel("entrypoint") 
        .get(); 
} 

    @Bean 
    public IntegrationFlow jmsInboundFlowB() { 
     return IntegrationFlows 
        .from(
         Jms.inboundAdapter(bConnectionFactory) 
              .destination(bQueue), 
         e -> e.poller(Pollers.fixedRate(100, 
TimeUnit.MILLISECONDS).maxMessagesPerPoll(100)) 
        ).channel("entrypoint") 
        .get(); 
} 


    @Bean(name = "aConnectionFactory") 
    @Profile({"weblogic"}) 
    public ConnectionFactory aConnectionFactory() { 
     ConnectionFactory factory = null; 
     JndiTemplate jndi = new JndiTemplate(); 
     try { 
      factory = (ConnectionFactory) jndi.lookup("jms/ConnectionFactory"); 
     } catch (NamingException e) { 
      logger.error("NamingException for jms/ConnectionFactory", e); 
     } 

     return factory; 
    } 

    @Bean(name = "bConnectionFactory") 
    @Profile({"weblogic"}) 
    public ConnectionFactory bConnectionFactory() { 
     ConnectionFactory factory = null; 
     JndiTemplate jndi = new JndiTemplate(); 
     try { 
      factory = (ConnectionFactory) jndi.lookup("jms/ConnectionFactory"); 
     } catch (NamingException e) { 
      logger.error("NamingException for jms/ConnectionFactory", e); 
     } 

     return factory; 
    } 

} 

Есть идеи, что не так в этом коде? Это кажется прямым, но указание Qualifier не работает, я также попытался использовать @Resource. Что мне там не хватает?

Любая помощь приветствуется.

+0

весной путает между @Resource (имя = «aConnectionFactory») и @Bean (name = "aConnectionFactory"). Поскольку консоль предполагает, что вам нужно отметить один из них как первичный (тот же для bConnectionFactory) – kuhajeyan

ответ

4

В коде нет ничего плохого.

Это просто JmsAnnotationDrivenConfiguration от Spring Boot, который не любит ваши два бобов, но требует только одного.

  1. Почему просто не следует с того, что в докладе рекомендаций и отметить один из них с @Primary?

  2. Похоже, вы не используете функцию автоматической конфигурации Spring загрузки JMS, так что было бы просто просто отключить JmsAnnotationDrivenConfiguration: http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration

+0

Спасибо Artem, я не могу отметить ни одного из них как @Primary, так как мне нужно, чтобы два из них были автообновлены, чтобы определить два разных jmsInboudFlows (из разных очередей, используя разные заводы связи). – karruma

+0

Это правильно, но вы можете использовать '@ Autowired' вместе с' @ Qualifier'. Но в любом случае, я думаю, вам было бы лучше отключить 'JmsAnnotationDrivenConfiguration', поскольку вы полностью не используете его функциональность. –

0

Проблема состоит

javax.jms.ConnectionFactory является синглтон, то нужен один объект, тип!

решения для вашей проблемы:

  • Если вам нужно два объекта, которые создают объекты и расширение ConnectionFactory их изменить масштаб по мере необходимости.
  • попробуйте @Scope («singleton») или @Scope («прототип»).
  • если вы получили ошибку, сделайте объекты. затем используйте область @Scope («singleton»)
  • «Other Two» отключить другой класс, который уже использует и устанавливает такой.
+0

Не уверен, что вы предлагаете - мне нужны два одноэлементного типа того же типа, и насколько я знаю, у меня могут быть две синглтон-бобы одна и та же. Я ищу, чтобы автосогласовать правильный. – karruma

+0

Правильно, найдите интерфейс или класс реализации, где-то в вашем проекте, посмотрите, что не так.попробуйте определить область, которая @Scope («прототип»), для ваших двух beas –

 Смежные вопросы

  • Нет связанных вопросов^_^