Spring Boot应用中Google Cloud Pub/Sub自动配置不生效问题
Spring Boot 公共库集成GCP Pub/Sub注入失败问题
问题场景
基于Spring Boot 2.4.2开发微服务架构,使用Google Cloud Pub/Sub实现服务间通信,将Pub/Sub相关逻辑与配置抽离为独立公共依赖库。业务微服务引入该公共库后,启动时注入公共库提供的PubSubConsumerServiceImpl失败。
报错信息
Description: Parameter 0 of constructor in com.myCompany.myproject.messaging.adapter.PubSubConsumerServiceImpl required a bean of type 'com.google.cloud.spring.pubsub.core.PubSubTemplate' that could not be found. Action: Consider defining a bean of type 'com.google.cloud.spring.pubsub.core.PubSubTemplate' in your configuration. Process finished with exit code 1
现有实现代码
PubSubConsumerServiceImpl 类定义
import com.google.cloud.spring.pubsub.core.PubSubTemplate; @Slf4j @Service public class PubSubConsumerServiceImpl implements ConsumerConnector { private final PubSubTemplate pubSubTemplate; private final ObjectMapper mapper; private final MessagingConfigParams configParams; public PubSubConsumerServiceImpl(PubSubTemplate pubSubTemplate, ObjectMapper objectMapper, MessagingConfigParams configParams){ this.pubSubTemplate = pubSubTemplate; this.mapper = objectMapper; this.configParams = configParams; } @Override public void subscribe(String subscriptionName, Consumer<OutboxEvent> consumer) { // 订阅逻辑实现 } }
公共库自动配置类
@Configuration @ComponentScan @EnableConfigurationProperties(MessagingConfigParams.class) public class PubsubAutoConfiguration{ }
spring.factories 自动配置注册
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.myCompany.myproject.messaging.PubsubAutoConfiguration
依赖配置(公共库build.gradle)
implementation("com.google.cloud:spring-cloud-gcp-starter-pubsub:2.0.4")
已尝试的无效方案
- 在
PubsubAutoConfiguration类上添加@Import(GcpPubSubAutoConfiguration.class)注解 - 在
PubsubAutoConfiguration中手动定义PubSubTemplate类型Bean,代码如下:
@Bean @ConditionalOnMissingBean public PubSubTemplate pubSubTemplate(PubSubPublisherTemplate pubSubPublisherTemplate, PubSubSubscriberTemplate pubSubSubscriberTemplate) { return new PubSubTemplate(pubSubPublisherTemplate, pubSubSubscriberTemplate); }
执行以上操作后启动仍然报相同错误。
根因分析与修复步骤
问题由三个配置错误共同导致,按以下顺序修复即可解决:
- 修正依赖作用域:Gradle中
implementation引入的依赖不会传递到下游项目,业务微服务引入公共库时,实际类路径下没有GCP Pub/Sub的相关依赖包,自然无法触发GCP的自动配置生成PubSubTemplateBean。将公共库中GCP Pub/Sub依赖的作用域改为api,保证依赖可传递:// 公共库build.gradle中修改 api("com.google.cloud:spring-cloud-gcp-starter-pubsub:2.0.4") - 修正自动配置加载顺序:自动配置类加载时没有指定顺序,公共库的配置优先于GCP官方自动配置加载,此时
PubSubTemplate还未创建就尝试注入,必然报错。删除手动定义的PubSubTemplateBean(手动定义依赖的上游Bean同样由GCP自动配置生成,上游未加载时手动定义也会失败),在配置类上添加@AutoConfigureAfter注解,指定在GCP自动配置完成后再加载自定义配置:@Configuration @AutoConfigureAfter(GcpPubSubAutoConfiguration.class) @EnableConfigurationProperties(MessagingConfigParams.class) @Import(GcpPubSubAutoConfiguration.class) public class PubsubAutoConfiguration { } - 移除无范围的组件扫描,避免Bean提前初始化:自动配置类上的无参
@ComponentScan会在配置加载时立即扫描包下的@Service组件,触发PubSubConsumerServiceImpl提前实例化。首先移除PubSubConsumerServiceImpl类上的@Service注解,改为在自动配置类中通过@Bean显式注册该服务,保证实例化时所有依赖的Bean已经准备完成:@Configuration @AutoConfigureAfter(GcpPubSubAutoConfiguration.class) @EnableConfigurationProperties(MessagingConfigParams.class) @Import(GcpPubSubAutoConfiguration.class) public class PubsubAutoConfiguration { @Bean public PubSubConsumerServiceImpl pubSubConsumerServiceImpl(PubSubTemplate pubSubTemplate, ObjectMapper objectMapper, MessagingConfigParams configParams) { return new PubSubConsumerServiceImpl(pubSubTemplate, objectMapper, configParams); } }
修改完成后重新编译公共库,业务微服务更新依赖后即可正常启动。
内容的提问来源于stack exchange,提问作者Ashref Nasri
相关产品推荐
相关产品推荐

