【问题标题】:Cloud storage 1.88.0 exception when accessing inputstream云存储 1.88.0 访问输入流时出现异常
【发布时间】:2019-08-28 10:00:59
【问题描述】:

我刚刚从应用引擎标准的 1.76.0 升级到谷歌云存储 java 1.88.0。我在尝试读取 com.google.cloud.storage.Blob 对象时遇到了以下问题。解决方法不适用于应用程序引擎上的大文档,那么有解决方案吗?也许我需要检查一些依赖项?

ByteStreams.copy(Channels.newInputStream(blob.reader()), resp.getOutputStream());

现在失败了

java.lang.NoSuchMethodError: com.google.api.services.storage.Storage$Objects$Get.setReturnRawInputStream(Z)Lcom/google/api/client/googleapis/services/AbstractGoogleClientRequest;
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.createReadRequest(HttpStorageRpc.java:658)
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.read(HttpStorageRpc.java:693)
    at com.google.cloud.storage.BlobReadChannel$1.call(BlobReadChannel.java:127)
    at com.google.cloud.storage.BlobReadChannel$1.call(BlobReadChannel.java:124)
    at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
    at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
    at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
    at com.google.cloud.storage.BlobReadChannel.read(BlobReadChannel.java:123)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    at java.io.InputStream.read(InputStream.java:101)
    at com.google.common.io.ByteStreams.copy(ByteStreams.java:108)

但可以替换为,作为一种解决方法(但可能会大大降低内存效率):

ByteSource.wrap(storage.readAllBytes(blob)).copyTo(resp.getOutputStream());

相关的 pom 条目可能是:

        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.9.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
            <version>1.88.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>

        <!-- firestore fails with NoClassDefFoundError: 
             com/google/protobuf/GeneratedMessageV3 without this -->

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.6.1</version>
        </dependency>

【问题讨论】:

  • 你找到解决方案了吗?
  • 不,我还没有尝试其他任何方法。

标签: java firebase google-app-engine google-cloud-storage


【解决方案1】:

App Engine 文档中所述,为了从云存储桶读取和写入,您应该使用 appengine 工具依赖项:

<dependency>
    <groupId>com.google.appengine.tools</groupId>
    <artifactId>appengine-gcs-client</artifactId>
    <version>0.7</version>
</dependency>

遵循前面提到的文档后,我的 App Engine 应用运行良好。

请尝试此文档并告诉我们是否适合您。

【讨论】:

  • 您指向的文档是指旧的“不推荐”访问存储桶的方式,所以这不是我们在这里使用的(从帖子中可以看出,我们使用的是“ com.google.cloud.storage.Blob”,因此使用新的cloud.google.com/appengine/docs/standard/java/…cloud.google.com/storage/docs/reference/… 方式)。无论如何,我尝试了您的建议,但毫无疑问地得到了同样的错误。顺便说一句,我认为这在更改为 1.88.0 之前有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
相关资源
最近更新 更多