You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Cloud GCP PubSub版本迁移报错:DefaultSubscriberFactory构造参数不匹配

解决方案

Spring Cloud GCP 5.x版本对DefaultSubscriberFactory的构造器做了调整,移除了仅接收GcpProjectIdProvider的单参数构造器,强制要求传入PubSubConfiguration参数(注意这里是框架提供的com.google.cloud.spring.pubsub.core.PubSubConfiguration,不是你自定义的配置类)。

修改步骤:

  1. 在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;
}
  1. 推荐使用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();
}
  1. 同步修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:02:39