2016-11-07 88 views
3

我正在嘗試使用NoUniqueBeanDefinitionException在Spring註解驅動的配置

類型沒有合格的bean自動裝配兩個bean時,下面的錯誤[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; 
    } 

} 

任何想法這段代碼有什麼問題?這似乎很簡單,但指定限定符不起作用,我也嘗試使用@Resource。我在那裏錯過了什麼?

任何幫助表示讚賞。

+0

春天混淆和@Bean(name =「aConnectionFactory」)。作爲控制檯建議你需要將它們標記爲主(同bConnectionFactory) – kuhajeyan

回答

4

您的代碼沒有問題。

這就是Spring Boot的JmsAnnotationDrivenConfiguration,它不喜歡你的兩個ConnectionFactory豆,但只需要一個。

  1. 爲什麼不按照該報告的建議,並用@Primary標記其中之一?

  2. 看起來你不使用Spring引導JMS自動配置功能,所以這將是隻是簡單的禁用JmsAnnotationDrivenConfiguration:你@Resource(name = 「aConnectionFactory」)之間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是單身,你需要一個對象,它的類型!

解決你的問題:

  • 如果您需要兩個對象,創建對象和擴展連接工廠 需要他們改變範圍。
  • 嘗試@Scope(「singleton」)或@Scope(「prototype」)。
  • 如果您收到錯誤,請創建一個對象。然後使用示波器@Scope(「singleton」)
  • 「Other Two」使已經使用的其他類變形並設置這樣的。
+0

不知道你在暗示什麼 - 我需要的是兩個相同類型的單例,並且據我所知,我可以有兩個單例bean相同。我正在尋找的是自動裝配正確的。 – karruma

+0

這是正確的,發現實現接口或類, 那裏有你的項目,看到錯誤是乾淨的。嘗試爲你的兩個beas定義作用域@Scope(「prototype」) –

相關問題