【发布时间】:2018-05-01 18:08:08
【问题描述】:
我正在尝试使用 Spring 从 Google Storage Buckets 访问文件,最终目标是使用 MultiResourceItemReader 从存储桶中读取多个 XML 文件。当 XML 文件在我的机器上本地(不是 GCP)时,我目前正在使用 Spring 处理这个过程
现在,我想做同样的事情,但不是我机器上的 XML 文件,而是 GCP 存储桶中的文件。我可以访问 Spring 之外的存储桶内容,一次一个文件。例如,这一点测试代码允许我访问存储桶,然后查看存储桶中的文件。在这个 sn-p 中,我通过 JSON 密钥文件设置凭据。 (不是环境变量)
public static void storageDriver() throws IOException {
// Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS
// environment variable, you can explicitly load the credentials file to construct the
// credentials.
String name = "";
String bucketName = "";
String bucketFileName = "";
String bucketFullPath = "";
Resource myBucker;
GoogleCredentials credentials;
File credentialsPath = new File("mycreds.json");
try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
}
Storage storage = StorageOptions.newBuilder()
.setCredentials(credentials)
.setProjectId("myProject")
.build()
.getService();
for (Bucket bucket:storage.list().iterateAll()){
if(bucket.getName().equalsIgnoreCase("myGoogleBucket")){
bucketName = bucket.getName();
System.out.println(bucket);
for (Blob blob : bucket.list().iterateAll()){
bucketFileName = blob.getName();
bucketFullPath = "gs://"+bucketName+"/"+bucketFileName;
System.out.println(bucketFullPath);
}
}
};
但是,当我尝试对 Spring 执行以下操作时,Spring 抱怨我没有定义 GOOGLE_APPLICATION_CREDENTIALS。 (当然我不这样做,因为我是以编程方式进行的。
例如,我将添加
@Value("gs://myGoogleBucket")
private Resource[] resources;
应用程序默认凭据不可用。如果在 Google Compute Engine 中运行,它们就可用。否则,必须定义环境变量GOOGLE_APPLICATION_CREDENTIALS 指向定义凭据的文件。
【问题讨论】:
-
在使用 Intellij 时,在运行/调试配置中,我定义了环境变量 GOOGLE_APPLICATION_CREDENTIALS 并让它指向我正在通过代码执行的 json 文件。如果我通过 IDE 运行它,这将超过 Spring 运行时错误。除了通过环境变量设置凭证 json 文件之外,还有其他方法可以告诉 Spring 凭证 json 文件是什么。它也不喜欢我之前展示的代码。如果我要将其部署到服务器而不是在本地运行,这将是至关重要的信息。
-
更深入地了解这一点。 ,如何通过Spring访问存储桶“列表”(Bucket中的文件)以使用MultiResourceItemReader?换句话说,我如何让 Spring 的行为就像 google 存储就像计算机上的目录一样。
标签: java spring google-cloud-storage