繁体   English   中英

在 Spring 中设置 GOOGLE_APPLICATION_CREDENTIALS

[英]Setting GOOGLE_APPLICATION_CREDENTIALS in Spring

我正在尝试使用 Spring 从 Google Storage Buckets 访问文件,最终目标是使用 MultiResourceItemReader 从存储桶中读取多个 XML 文件。 当 XML 文件在我的机器上本地(不是 GCP)时,我目前让 Spring 处理这个过程

现在,我想做同样的事情,但不是我机器上的 XML 文件,而是文件在 GCP 存储桶中。 我可以在 Spring 之外访问存储桶内容,一次一个文件。 例如,这段测试代码允许我访问存储桶,然后查看存储桶中的文件。 在此代码段中,我通过 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指向定义凭据的文件。

Spring Cloud GCP 简化了您的 GCS 配置。

您可以为您的应用程序添加存储支持 然后,通过spring.cloud.gcp.storage.credentials.location属性指定您的服务帐户凭据的位置,或者使用 Google Cloud SDK 使用应用程序默认凭据登录

这将自动为您提供一个完全配置的Storage对象, @Value(gs://YOUR-BUCKET/YOUR-FILE)应该可以正常工作。

我尝试了很多方法,但最后这个 spring 文档的摘录对我有用:

由于日志记录的设置方式, application.properties中定义的 GCP 项目 ID 和凭据将被忽略。 相反,您应该将GOOGLE_CLOUD_PROJECTGOOGLE_APPLICATION_CREDENTIALS环境变量分别设置为项目 ID 和凭证私钥位置。 如果您使用 Google Cloud SDK,可以分别使用gcloud config set project [YOUR_PROJECT_ID]gcloud auth application-default login命令轻松完成此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM