2016-11-07 56 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”) –

相关问题