【问题标题】:Unable to access app engine datastore via Objectify on a local server无法通过本地服务器上的 Objectify 访问应用引擎数据存储
【发布时间】:2018-04-23 11:24:17
【问题描述】:

我正在尝试使用 Eclipse 在 localhost 上运行应用程序引擎 spring 项目。我在控制台中收到以下错误。

Apr 23, 2018 4:01:04 PM com.google.auth.oauth2.ComputeEngineCredentials runningOnComputeEngine
WARNING: Failed to detect whether we are running on Google Compute Engine.
java.net.SocketException: Network is unreachable: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:104)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)
    at com.google.auth.oauth2.ComputeEngineCredentials.runningOnComputeEngine(ComputeEngineCredentials.java:191)
    at com.google.auth.oauth2.DefaultCredentialsProvider.tryGetComputeCredentials(DefaultCredentialsProvider.java:270)
    at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentialsUnsynchronized(DefaultCredentialsProvider.java:194)
    at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:112)
    at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:127)
    at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:100)
    at com.google.cloud.ServiceOptions.defaultCredentials(ServiceOptions.java:298)
    at com.google.cloud.ServiceOptions.<init>(ServiceOptions.java:272)
    at com.google.cloud.datastore.DatastoreOptions.<init>(DatastoreOptions.java:102)
    at com.google.cloud.datastore.DatastoreOptions.<init>(DatastoreOptions.java:35)
    ... 

如何提供凭据以使用本地主机中的数据存储? 当我访问数据存储时,我在控制台上得到以下信息。

2018-04-23 17:22:05.849:WARN:oejs.ServletHandler:qtp152005629-14: org.spring.framework.web.util.NestedServletException: Request processing failed; nested exception is com.google.cloud.datastore.DatastoreException: Unauthenticated.
Caused by: 
com.google.cloud.datastore.DatastoreException: Unauthenticated

【问题讨论】:

  • 这只是一个警告——究竟什么不起作用?
  • 2018-04-23 17:22:05.849:WARN:oejs.ServletHandler:qtp152005629-14: org.springframework.web.util.NestedServletException: 请求处理失败;嵌套异常是 com.google.cloud.datastore.DatastoreException: Unauthenticated.

标签: google-app-engine google-cloud-datastore objectify


【解决方案1】:

Objectify v6 使用适用于 Google Cloud Platform 的 Datastore SDK(您可以将其视为 GCP 的“通用”SDK)。该 SDK 对云服务进行实际 API 调用,即使它在本地运行也是如此。如果您想针对本地数据存储运行测试/开发,您需要做以下两件事之一。

选项一

不要使用 GCP Datastore SDK,而是使用 App Engine SDK 的 Datastore 绑定。 Objectify 在 v6 中已承诺使用 GCP SDK,但 v5 使用了 App Engine SDK。您可以降级到 v5,一切都会“正常工作”。

选项二

如果您想继续使用 Objectify v6,您需要安装一个额外的 gcloud 组件来运行本地数据存储模拟器,并且您需要设置一些环境变量。更多细节here,但简短的版本是:

安装并启动数据存储模拟器:

$ gcloud components install cloud-datastore-emulator
$ gcloud beta emulators datastore start

然后告诉您的应用程序在哪里可以找到它:

$ (gcloud beta emulators datastore env-init)

或者您可以手动设置相关的环境变量。在运行应用程序的机器上,按照 env-init 命令的输出设置环境变量和值。例如:

gcloud beta emulators datastore env-init
export DATASTORE_EMULATOR_HOST=localhost:8432
export DATASTORE_PROJECT_ID=my-project-id

【讨论】:

  • 应用程序在本地主机上运行,​​只有使用数据存储的部分不工作。我浏览了你提到的链接,它没有提到任何关于本地主机身份验证的内容。
  • 您使用了错误的 SDK。您正在使用适用于 Google Cloud Platform 的 Datastore SDK(通用 SDK)。即使在本地运行,该 SDK 也会对云服务进行实际的 API 调用。您需要使用 App Engine SDK 的 Datastore 绑定。
  • 我正在使用 github.com/objectify/objectify/wiki 中指定的 com.googlecode.objectify 导入路径。
  • 啊,我明白了。在这种情况下,您需要安装一个额外的 gcloud 组件来运行本地数据存储模拟器,并且您需要设置一些环境变量。更多细节在这里:cloud.google.com/datastore/docs/tools/datastore-emulator
  • @ArunMuthuraman 再次更新了我的答案,提供了更多细节。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多