我有一个弹簧启动应用程序工作正常,直到我从1.2.0.M1更新到1.2.0.M2。由于spring-boot RabbitAutoConfiguration导致的UnsatisfiedDependencyException,应用程序将无法构建:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'jmsMessagingTemplate' defined in class path resource [org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration$MessagingTemplateConfiguration.class]:
Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.amqp.rabbit.core.RabbitTemplate]: :
No qualifying bean of type [org.springframework.amqp.rabbit.core.RabbitTemplate] is defined:
expected single matching bean but found 3: looperTemplate,pingTemplate,orgRequestTemplate; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [org.springframework.amqp.rabbit.core.RabbitTemplate] is defined:
expected single matching bean but found 3: looperTemplate,pingTemplate,orgRequestTemplate
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:751) ~[spring-beans-4.1.1.RELEASE.jar:4.1.1.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:466) ~[spring-beans-4.1.1.RELEASE.jar:4.1.1.RELEASE]
问题是我有RabbitMQ模板,但我有3个,它需要一个限定符来选择一个模板。但是这段代码是在spring-boot中,而不是我的代码。我不想改变spring-boot代码,但我不确定在代码中应该做些什么来防止这种异常。
我可以看到在1.2.0.M2版本中添加了有问题的jmsMessagingTemplate。这个命名也有误导性,因为我的应用程序中没有启用JMS(尽管这是spring-boot中的RabbitMQ特定自动配置文件)。
关于如何在不删除模板或修改spring-boot代码的情况下配置代码的任何建议?
答案 0 :(得分:2)
我已创建#1701来跟踪命名问题。你应该在那里阅读rabbitMessagingTemplate
。
Boot中有几个自动配置实例,如果他们没有使用“默认”名称,则需要使用@Primary
标记某些类型。例如,如果不存在JdbcTemplate
并且存在数据源,则会自动为您创建dataSource
。如果您有多个@Primary
,请将其中一个命名为RabbitTemplate
。
在您的情况下,RabbitMQ的消息传递自动配置需要将一个rabbitTemplate
命名为@Primary
,或将三个中的一个标记为{{1}}。
这很烦人,我们应该做得更好。我为此创建了#1702。
请告诉我这是否适合你。谢谢!