Spring Cloud GCP PubSub版本迁移报错:DefaultSubscriberFactory构造参数不匹配
解决方案
Spring Cloud GCP 5.x版本对DefaultSubscriberFactory的构造器做了调整,移除了仅接收GcpProjectIdProvider的单参数构造器,强制要求传入PubSubConfiguration参数(注意这里是框架提供的com.google.cloud.spring.pubsub.core.PubSubConfiguration,不是你自定义的配置类)。
修改步骤:
- 在
mySubscriberFactory方法中注入框架的PubSubConfiguration
直接将PubSubConfiguration作为方法参数注入,Spring会自动提供这个实例。修改后的代码如下:
import com.google.cloud.spring.pubsub.core.PubSubConfiguration; @Bean @Qualifier("mySubscriberFactory") public DefaultSubscriberFactory mySubscriberFactory( GcpProjectIdProvider gcpProjectIdProvider, PubSubConfiguration pubSubConfiguration, ApplicationProperties applicationProperties ) throws IOException { // 使用新的双参数构造器 final DefaultSubscriberFactory defaultSubscriberFactory = new DefaultSubscriberFactory(gcpProjectIdProvider, pubSubConfiguration); var serviceAccountCredentials = ServiceAccountCredentials.fromStream( new ByteArrayInputStream(applicationProperties.getGoogleCloudStorage().getAuthentication().getBytes())); defaultSubscriberFactory.setCredentialsProvider(FixedCredentialsProvider.create(serviceAccountCredentials)); return defaultSubscriberFactory; }
- 推荐使用Builder模式(更灵活)
5.x版本也提供了Builder方式来创建DefaultSubscriberFactory,代码更清晰:
import com.google.cloud.spring.pubsub.core.PubSubConfiguration; @Bean @Qualifier("mySubscriberFactory") public DefaultSubscriberFactory mySubscriberFactory( GcpProjectIdProvider gcpProjectIdProvider, PubSubConfiguration pubSubConfiguration, ApplicationProperties applicationProperties ) throws IOException { var serviceAccountCredentials = ServiceAccountCredentials.fromStream( new ByteArrayInputStream(applicationProperties.getGoogleCloudStorage().getAuthentication().getBytes())); return DefaultSubscriberFactory.builder(gcpProjectIdProvider, pubSubConfiguration) .credentialsProvider(FixedCredentialsProvider.create(serviceAccountCredentials)) .build(); }
- 同步修改
DefaultPublisherFactory的构造(可选但建议)
同样,5.x版本中DefaultPublisherFactory的构造器也做了相同调整,所以你的PubSubTemplate创建代码也需要同步更新:
@Bean @Qualifier("myPubSubTemplate") public PubSubTemplate mercareonPubSubTemplate( GcpProjectIdProvider gcpProjectIdProvider, PubSubConfiguration pubSubConfiguration, @Qualifier("mySubscriberFactory") SubscriberFactory subscriberFactory ) { DefaultPublisherFactory publisherFactory = new DefaultPublisherFactory(gcpProjectIdProvider, pubSubConfiguration); return new PubSubTemplate(publisherFactory, subscriberFactory); }
注意事项
如果你的自定义配置类也叫PubSubConfiguration,为避免类名冲突,注入时可以使用全类名:
@Bean @Qualifier("mySubscriberFactory") public DefaultSubscriberFactory mySubscriberFactory( GcpProjectIdProvider gcpProjectIdProvider, com.google.cloud.spring.pubsub.core.PubSubConfiguration frameworkPubSubConfig, ApplicationProperties applicationProperties ) throws IOException { final DefaultSubscriberFactory defaultSubscriberFactory = new DefaultSubscriberFactory(gcpProjectIdProvider, frameworkPubSubConfig); // ... 其余代码不变 }
内容的提问来源于stack exchange,提问作者Amir Choubani
相关产品推荐
相关产品推荐

