Настройка GOOGLE_APPLICATION_CREDENTIALS весной

Я пытаюсь использовать Spring для доступа к файлам из Google Storage Buckets с конечной целью использования MultiResourceItemReader для чтения нескольких XML-файлов из корзины. В настоящее время у меня Spring работает с этим процессом, когда файлы XML находятся локально на моем компьютере (не GCP)

Теперь я хочу сделать то же самое, но вместо файлов 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, указывающую на файл, определяющий учетные данные.

При использовании Intellij в конфигурациях запуска / отладки я определяю переменную среды GOOGLE_APPLICATION_CREDENTIALS и указываю ей на файл json, который я делаю с помощью кода. Это проходит через ошибку времени выполнения Spring, ЕСЛИ я запускаю это через IDE .. Есть ли другой способ сообщить Spring, что такое json-файл учетных данных, помимо его установки через переменную окружения. Ему также это не нравится из-за кода, который я показал ранее. Это было бы критически важной информацией, если бы я развернул это на сервере, а не запускал бы его локально.

codem1966 01.05.2018 21:41

чтобы перейти к делу. , как получить доступ к «списку» ведра (файлам внутри ведра) через Spring, чтобы использовать MultiResourceItemReader? Другими словами, как мне заставить Spring вести себя так, как если бы хранилище Google было похоже на каталог на компьютере.

codem1966 02.05.2018 19:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
3 233
2

Ответы 2

Spring Cloud GCP упрощает настройку GCS.

Вы можете добавить Поддержка хранилища в свое приложение. Затем укажите местоположение учетных данных вашей учетной записи через свойство spring.cloud.gcp.storage.credentials.location или вход в систему с учетными данными приложения по умолчанию с помощью Google Cloud SDK.

Это автоматически предоставит вам полностью сконфигурированный объект Storage, и такие вещи, как @Value(gs://YOUR-BUCKET/YOUR-FILE), должны просто работать.

Это решает проблему GOOGLE_APPLICATION_CREDENTIALS за счет использования зависимости spring-cloud-gcp-starter-storage со свойством spring.cloud.gcp.storage.credentials.location. Однако основная проблема доступа к нескольким файлам в корзине все еще существует. например, @Value("gs://myGoogleBucket/*.xml")private Resource[] resources;

codem1966 07.05.2018 19:19

Вроде два вопроса в одном. Единственное подобное предложение поддержки spring-cloud-gcp для массовой загрузки файлов из GCS - это Адаптеры каналов Spring Integration. В настоящее время мы не предлагаем поддержку для таких случаев, как @Value("gs://myGoogleBucket/*.xml").

João André Martins 08.05.2018 20:24

Вопрос заключался не в том, как использовать Spring для доступа к одному файлу в ведре, а в том, как получить доступ к нескольким файлам в ведре, чтобы использовать класс MultiResourceItemReader. Вы (Жоао) говорите, что Spring не поддерживает это, когда дело доходит до хранилища Google?

codem1966 12.05.2018 00:37

Прямо сейчас проект spring-cloud-gcp не поддерживает такое разрешение ресурсов шаблона. Вот проблема с отслеживанием, не стесняйтесь вносить туда свой вклад!

João André Martins 14.05.2018 16:12

Я пробовал много способов, но, наконец, этот отрывок из весенних документов - тот, который сработал для меня:

Due to the way logging is set up, the GCP project ID and credentials defined in application.properties are ignored. Instead, you should set the GOOGLE_CLOUD_PROJECT and GOOGLE_APPLICATION_CREDENTIALS environment variables to the project ID and credentials private key location, respectively. You can do this easily if you’re using the Google Cloud SDK, using the gcloud config set project [YOUR_PROJECT_ID] and gcloud auth application-default login commands, respectively.

Другие вопросы по теме