gpt4 book ai didi

java - Google App Engine 和存储 API 身份验证错误

转载 作者:行者123 更新时间:2023-12-01 10:06:21 25 4
gpt4 key购买 nike

我有一个网络应用程序,它接收文件,然后尝试将其添加到在 Google App Engine 上运行的 Google Cloud Storage。这是我收到的错误:

com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Get()' was not found.
at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:173)
at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:171)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:88)
at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26)
at com.google.appengine.api.memcache.MemcacheServiceImpl.get(MemcacheServiceImpl.java:49)
at com.google.appengine.api.appidentity.AppIdentityServiceImpl.getAccessToken(AppIdentityServiceImpl.java:286)
at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential.intercept(AppIdentityCredential.java:98)
at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential$AppEngineCredentialWrapper.intercept(AppIdentityCredential.java:243)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)

这在我的本地机器上运行得很好(有 gutil 和所有设置)。当部署到 GAE 时,它会失败并出现上述情况。已检查权限,它显示对所有 Google Cloud API 的访问权限。此代码是失败的部分,直接来自 Google 的示例 ( https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/storage/json-api/src/main/java/StorageFactory.java )

 private static Storage buildService() throws IOException, GeneralSecurityException {
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, jsonFactory);

if (credential.createScopedRequired()) {
Collection<String> bigqueryScopes = StorageScopes.all();
credential = credential.createScoped(bigqueryScopes);
}

return new Storage.Builder(transport, jsonFactory, credential)
.setApplicationName("GCS Samples")
.build();
}

为了完整起见,这里是使用上面的 buildService 的代码(同样来自上面的 github 示例链接)

            Storage client = StorageFactory.getService();
Storage.Objects.Insert insertRequest = client.objects().insert(
bucketName, objectMetadata, contentStream);
insertRequest.execute();

pom.xml 的 deps 部分

  <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.google.appengine.tools</groupId>
<artifactId>appengine-gcs-client</artifactId>
<version>RELEASE</version>
</dependency>

GAE 控制台显示它正在使用 GAE v1.9.35。这是来自实例的编辑信息,显示底部可用的权限

Module & version
Module: default
Version: 20160405t155800
App Engine version: 1.9.35
Managed by
Google
Availability
...
GAE managed VM for module: default, version: 20160405t155800
Tags
None
Machine type

g1-small (1 vCPU, 1.7 GB memory)
CPU platform

Intel Haswell
Zone

us-central1-c

IP forwarding

off
Boot disk and local disks

Name Size (GB) Type Mode
redacted
10
Standard persistent disk
Boot, read/write

Delete boot disk when instance is deleted
Additional disks


Preemptibility
Off (recommended)
Automatic restart
Off
On host maintenance
Terminate VM instance
Service account
-----
Cloud API access scopes

This instance has full API access to all Google Cloud services.

同样,该应用在本地运行并将文件上传发送到 Google Cloud Storage。多次尝试将应用程序上传到 GAE,但没有成功。该应用程序已部署到 GAE 灵活版本,它显示了以下内容:

latest: Pulling from google_appengine/openjdk8

此外,使用 GcsService 库会以不同的方式失败,但我怀疑这是因为,出于某种原因,我的应用程序在 GAE 上无法正确识别为具有适当授权的 GAE 应用程序:

Caused by: java.io.IOException: java.lang.NullPointerException
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.getInstance(LocalRawGcsService.java:186)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.access$000(LocalRawGcsService.java:109)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.ensureInitialized(LocalRawGcsService.java:194)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.beginObjectCreation(LocalRawGcsService.java:249)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.beginObjectCreation(LocalRawGcsService.java:92)
at com.google.appengine.tools.cloudstorage.GcsServiceImpl$1.call(GcsServiceImpl.java:74)
at com.google.appengine.tools.cloudstorage.GcsServiceImpl$1.call(GcsServiceImpl.java:70)

代码:

                GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
InputStream inputStream = uploadfile.getInputStream();
copy(inputStream, Channels.newOutputStream(outputChannel));

最佳答案

您只能在支持 GAE 标准 API(如本例中的 com.google.appengine.api.memcache)的基本运行时上使用它。列表如下:https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#base_images

您的案例中使用的基本运行时是 google_appengine/openjdk8,它不支持 GAE 标准环境 API。

现在,您可以通过此 gcloud-java 库使用新的 Java Cloud API(包括 GCS 存储访问):https://github.com/GoogleCloudPlatform/gcloud-java

关于java - Google App Engine 和存储 API 身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com