在Spring中设置GOOGLE_APPLICATION_CREDENTIALS

时间:2018-05-01 18:08:08

标签: java spring google-cloud-storage

我正在尝试使用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,指向定义凭证的文件。

2 个答案:

答案 0 :(得分:1)

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

您可以将Storage support添加到您的应用中。然后,通过spring.cloud.gcp.storage.credentials.location媒体资源或logging in with application default credentials using the Google Cloud SDK指定服务帐户凭据的位置。

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

答案 1 :(得分:0)

我尝试了很多方法,但是最后从spring docs摘录的内容对我有用:

由于设置了日志记录方式,因此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命令,则可以轻松完成此操作。