如何使用@Qualifier指定注入的WebServiceTemplate Bean解决同类型多实例冲突
问题根因
你当前遇到的报错和WebServiceTemplate类型的Bean无关,是两个配置类中声明WebServiceTemplate时,方法入参的Jaxb2Marshaller类型存在2个同类型Bean,Spring无法自动选择注入实例导致的,你之前调整WebServiceTemplate的Bean名称和注入注解的操作没有解决根问题。
修复步骤
1. 为两个Jaxb2Marshaller Bean指定明确名称
分别给两个配置类中的Jaxb2Marshaller声明添加name属性:
// EddClientConfig类中 @Bean(name = "jaxb2EddMarshaller") public Jaxb2Marshaller jaxb2EddMarshaller() { // 保留原有Marshaller配置逻辑 }
// ProposalClientConfig类中 @Bean(name = "jaxb2ProposalMarshaller") public Jaxb2Marshaller jaxb2PropposalDataMarshaller() { // 保留原有Marshaller配置逻辑 }
2. 为WebServiceTemplate的入参指定Marshaller
在两个WebServiceTemplate的Bean声明方法的入参上,通过@Qualifier指定对应要注入的Marshaller实例:
// EddClientConfig类中 @Bean(name = "eddTemplate") public WebServiceTemplate eddTemplate(@Qualifier("jaxb2EddMarshaller") Jaxb2Marshaller marshaller) { // 保留原有WebServiceTemplate配置逻辑 }
// ProposalClientConfig类中 @Bean(name = "proposalTemplate") public WebServiceTemplate proposalTemplate(@Qualifier("jaxb2ProposalMarshaller") Jaxb2Marshaller marshaller) { // 保留原有WebServiceTemplate配置逻辑 }
3. 修正业务类中的注入注解
注意统一Bean名称的小驼峰规范,避免大小写导致的匹配失败:
@Component public class ProposalDataClientImpl implements ProposalDataClient{ @Autowired @Qualifier("proposalTemplate") private WebServiceTemplate webServiceTemplate; // 保留原有业务逻辑 }
可选优化
如果某一个Jaxb2Marshaller是你业务中主要使用的,可以在对应的Bean声明上添加@Primary注解,该Marshaller会成为默认注入实例,其他非默认场景再加@Qualifier指定即可。
内容的提问来源于stack exchange,提问作者kodali
相关产品推荐
相关产品推荐

