无法通过本地服务器上的Objectify访问App Engine数据存储



我正在尝试使用Eclipse在Localhost上运行App Engine Spring Project。我在控制台中遇到以下错误。

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)
    ... 

如何提供凭证以使用Localhost中的数据存储?访问数据存储时,我会在控制台上获得以下内容。

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

Objectify V6使用DataStore SDK用于Google Cloud Platform(您可以将其视为GCP的"通用目的" SDK(。该SDK即使在本地运行,SDK也可以对云服务进行实际调用。如果要针对本地数据存储进行测试/开发,则需要做两件事之一。

选项

而不是使用GCP数据存储SDK,而是使用App Engine SDK的数据存储绑定。Objigtify已在V6中使用GCP SDK,但V5使用了App Engine SDK。您可以降级到V5,一切都会"工作"。

选项两个

如果要继续使用Objectify V6,则需要安装额外的GCLOUD组件来运行本地数据存储模拟器,并且需要设置一些环境变量。这里有更多详细信息,但简短版本为:

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

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

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

$ (gcloud beta emulators datastore env-init)

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

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

最新更新