【问题标题】:Listing buckets with Google Cloud Storage resulting in NoSuchMethodError, Java AppEngine使用 Google Cloud Storage 列出导致 NoSuchMethodError、Java AppEngine 的存储桶
【发布时间】:2019-03-21 02:48:42
【问题描述】:

试图仅列出我的 Google Cloud Storage 项目中的存储桶,但不太明白为什么我不断收到以下错误:

java.lang.NoSuchMethodError: com.google.api.services.storage.model.Bucket.getIamConfiguration()Lcom/google/api/services/storage/model/Bucket$IamConfiguration;

我正在使用以下 servlet 对其进行测试:

package servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Test() {
        super();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Storage storage = StorageOptions.getDefaultInstance().getService();
        for (Bucket bucket : storage.list().iterateAll()) { //this line is giving the error
            response.getWriter().write(bucket.getName());
        }
    }
}

在我的 pom 中我有:

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

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

这个特定示例不需要前一个依赖项,但我需要它用于应用程序的另一部分,我怀疑这可能是问题所在。有什么想法可能会出错吗?

【问题讨论】:

  • 我在一个简单的例子中尝试了你的代码,一切都很好。您是否可以自己尝试一下,看看是否遇到相同的错误?这将指向丢失某些访问云存储的权限的方向。您能否进一步详细说明此代码在何处运行以及是否由具有适当权限的用户或服务帐户运行?

标签: java google-cloud-storage


【解决方案1】:

由于您使用的是 Java:如果您愿意尝试 google-cloud-nio,它有一个 listBuckets 方法,如下所示:

Page<Bucket> buckets = CloudStorageFileSystem.listBuckets("my-project");
Iterator<Bucket> bucketIterator = buckets.iterateAll();
while (bucketIterator.hasNext()) {
  Bucket bucket = bucketIterator.next();
  // do something with the bucket
}

【讨论】:

  • 哇,太酷了!今天晚些时候我会试一试,让你知道发生了什么。谢谢!
【解决方案2】:

发现问题。我得到了一个 NoSuchMethodError ,因为显然所需的库没有包含在项目中,即使它被指定为 maven 依赖项。开发服务器上的库与生产服务器上的库之间存在某种不匹配。

Eclipse 中的解决方案是删除所有相关的 Google 库,然后通过右键单击项目 > 构建路径 > 配置构建路径...> 添加库... > Google Cloud Platform Libraries > 选择“应用程序”再次添加它们引擎 API”和“云存储”。

【讨论】:

  • 你知道如何在 IntelliJ 中解决这个问题吗?
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2014-10-09
  • 2014-01-05
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多