2016-09-04 9 views
0

Я пытаюсь сохранить файл в Google Cloud Storage с помощью службы jaxrs, работающей в Google App Engine. При попытке сохранить файл я становлюсь ниже ошибки.Google Cloud Storage - com.google.appengine.api.appidentity.AppIdentityServiceFailureException

com.google.appengine.tools.cloudstorage.NonRetriableException: com.google.appengine.api.appidentity.AppIdentityServiceFailureException: Служба AppIdentity бросил неожиданную ошибку. Детали:

Я пытаюсь сохранить файл в новом ковше и дал ниже разрешения ids (расчет, приложение и учетная запись службы) для ведра. Я также создал отдельную учетную запись службы и дал этой учетной записи службы также писатель Разрешение (с редактором роли на этот счет к проекту)

Я понимаю, что учетная запись службы не требуется, потому что от приложения двигателя с обслуживанием по умолчанию, мы должны быть в состоянии сохранить файл. Но просто попробовать, я также создал выше учетной записи службы и хранится файл в WEB-INF/ресурсы/service_account_credentials.json место и установить ниже свойства в Appengine-web.xml

<property name="GOOGLE_APPLICATION_CREDENTIALS" value="WEB-INF/resources/service_account_credentials.json"/> 

Я попытался ниже двух способов сохраните файл, но оба они дают ошибку.

Первый путь ...

Получение Услугу

GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder() 
      .initialRetryDelayMillis(10) 
      .retryMaxAttempts(10) 
      .totalRetryPeriodMillis(15000) 
      .build()); 

Сохранение файла

GcsFileOptions gcsFileOptions = null ; 
    GcsFileOptions.Builder builder = new GcsFileOptions.Builder() ; 
    if(aclEntityName != null) 
     builder = builder.acl(aclEntityName) ; 


    if(fileMetaData != null && !fileMetaData.isEmpty()) 
    for(Map.Entry<String, String> entry : fileMetaData.entrySet()){ 
     builder = builder.addUserMetadata(entry.getKey(), entry.getValue()) ; 
    } 
    gcsFileOptions = builder.build() ; 
    GcsFilename fileName = new GcsFilename(bucketName, name) ; 
    GcsService gcsService = StorageFactory.getGcsService() ; 
    GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, gcsFileOptions); 
    copy(contentStream, Channels.newOutputStream(outputChannel)); 

Второй путь, как указано ниже, также дает ту же ошибку ...

Получение службы

HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); 
JsonFactory jsonFactory = new JacksonFactory(); 
GoogleCredential credential = 
GoogleCredential.getApplicationDefault(transport, jsonFactory); 
if (credential.createScopedRequired()) { 
     Collection<String> scopes = StorageScopes.all(); 
     credential = credential.createScoped(scopes); 
    } 
    return new Storage.Builder(transport, jsonFactory, credential) 
      .setApplicationName("GCS Samples") 
      .build(); 

Сохранение файла второй путь

StorageObject objectMetaData = new StorageObject(); 
objectMetaData.setName(name); 

if(fileMetaData != null && fileMetaData.isEmpty() == false) 
    objectMetaData.setMetadata(fileMetaData) ; 

    // Set the access control list to publicly read-only 

if(aclEntityName != null && !aclEntityName.trim().equals("") 
    && aclRole != null && !aclRole.trim().equals("")) { 
    objectMetaData.setAcl(Arrays.asList(
     new ObjectAccessControl().setEntity(aclEntityName).setRole(aclRole))); 
} 

InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", contentStream); 


// Do the insert 
Storage client = StorageFactory.getService(); 
Storage.Objects.Insert insertRequest = client.objects().insert(
     bucketName, objectMetaData, mediaContent);  
if (mediaContent.getLength() > 0 && mediaContent.getLength() <= 2 * 1000 * 1000 /* 2MB */) { 
    insertRequest.getMediaHttpUploader().setDirectUploadEnabled(true); 
    } 
insertRequest.execute(); 

Что я делаю неправильно? Есть ли какой-либо параметр, который мне нужно сделать, чтобы исправить эту ошибку? Пожалуйста помоги !!!

+0

Предоставляет ли исключение более подробную информацию (после «Подробности:»)? Если да, включите его в свой вопрос. – SimonJ

+0

Нет, перед информацией нет информации. Просто пустое место. –

ответ

0

Из моего понимания Google Application Default Credentials, используя GOOGLE_APPLICATION_CREDENTIALS переменные окружения должно указывать на локальный файл, и, как правило, используется с gcloud инструментом командной строки для проверки подлинности при проверке коды на местном уровне.

Это, в соответствии с https://stackoverflow.com/a/36408645/374638, возможно, это должно быть в <env-variables>.

Смежные вопросы