【问题标题】:Java application cannot find credentials to access GCP Pub/SubJava 应用程序找不到访问 GCP Pub/Sub 的凭据
【发布时间】:2019-12-06 01:36:25
【问题描述】:

我正在尝试使用 GCP Java SDK 使用以下代码向 Pub/Sub 主题发送消息(在此 sn-p 中用占位符替换了实际项目 ID 和主题名称):

Publisher publisher = null;
ProjectTopicName topic = ProjectTopicName.newBuilder()
        .setProject("MY_PROJECT_ID")
        .setTopic("MY_TOPIC")
        .build();

try {
    publisher = Publisher.newBuilder(topic).build();

    for (final String message : data) {
        ByteString messageBytes = ByteString.copyFromUtf8(message);
        PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(messageBytes).build();
        ApiFuture<String> future = publisher.publish(pubsubMessage);
    }
} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    if (publisher != null) {
        publisher.shutdown();
    }
}

这会导致以下异常:

Exception in thread "main" java.lang.AbstractMethodError: com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.needsCredentials()Z
    at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:157)
    at com.google.cloud.pubsub.v1.stub.GrpcPublisherStub.create(GrpcPublisherStub.java:164)
    at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:171)
    at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:85)
    at com.google.cloud.pubsub.v1.Publisher$Builder.build(Publisher.java:718)
    at com.westonsankey.pubsub.MessageWriter.sendMessagesToPubSub(MessageWriter.java:35)
    at com.westonsankey.pubsub.MessageWriter.main(MessageWriter.java:24)

我已将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向 JSON 私钥文件,并确认我可以使用该私钥访问此应用程序中的其他 GCP 资源。该服务帐号拥有项目所有者,并且我已通过 Pub/Sub 控制台验证该服务帐号具有相应的权限。

使用 Pub/Sub 进行身份验证是否需要任何额外的步骤?

【问题讨论】:

  • 作为测试,我将从我的 Java 代码中检索 GOOGLE_APPLICATION_CREDENTIALS 环境变量的值,以验证它确实被正确传递。我还将验证我是否已从运行 JVM 的用户那里读取文件的权限。
  • 我认为应用程序访问环境变量指向的私钥文件不是问题,因为我已经确认我可以使用相同的身份验证访问应用程序中的其他 GCP 服务方法(使用 Cloud Storage 测试)。
  • 在您的代码中,您使用了一个名为 publisher 的变量。该实例是如何构造的?

标签: java google-cloud-platform google-cloud-pubsub


【解决方案1】:

问题在于没有访问凭据。看起来这是 gax-java 库的版本冲突。 needsCredentials 方法于 2019 年 6 月在 v1.46 中添加。也许您明确依赖于旧版本,或者另一个依赖项正在拉入旧版本并泄漏他们拉入的版本。如果是前者,请更新拉在 1.46 或更高版本中。如果是后者,可能需要shade the dependency

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2020-04-09
    • 2019-07-03
    • 2022-01-16
    • 2022-01-13
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多