调试 Google 数据存储:IllegalArgumentException:projectId 必须匹配以下模式

Debugging Google Datastore: IllegalArgumentException: projectId must match the following pattern

我正在开发一个应用程序引擎项目并使用 Google 数据存储存储我的数据。我想调试它,但我仍然有异常 java.lang.IllegalArgumentException: projectId must match the following pattern: ([a-z\d\-]{1,100}~)?([a-z\d][a-z\d\-\.]{0,99}:)?([a-z\d][a-z\d\-]{0,99})

我能够调试我的 appengine 项目,我可以部署它并将数据存储在 Google 数据存储区中。

为了允许调试,我遵循了数据存储模拟器的说明:

https://cloud.google.com/datastore/docs/tools/datastore-emulator

我已经安装了 Google Cloud SDK 并使用我的项目 ID 的默认值正确启动它(我还尝试通过命令行设置我自己的项目 ID)。

这是我在 gcloud 中执行的命令:

gcloud beta emulators datastore start --project="my-project-name"

WARNING: Reusing existing data in [C:\gcloud\emulators\datastore]. Executing: cmd /c C:\google-cloud-sdk\platform\cloud-datastore-emulator\cloud_datastore_emulator.cmd start --host=localhost --port=8806 --store_on_disk=True --consistency=0.9 --allow_remote_shutdown C:\gcloud\emulators\datastore [datastore] nov 27, 2016 5:08:17 PM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction apply [datastore] INFORMACI?N: Provided --allow_remote_shutdown to start command which is no longer necessary. [datastore] nov 27, 2016 5:08:17 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub [datastore] INFORMACI?N: Local Datastore initialized: [datastore]
Type: High Replication [datastore] Storage: C:\gcloud\emulators\datastore\WEB-INF\appengine-generated\local_db.bin [datastore] nov 27, 2016 5:08:17 PM io.grpc.internal.ManagedChannelImpl [datastore] INFORMACI?N: [ManagedChannelImpl@5f71c76a] Created with target localhost:8806 [datastore] nov 27, 2016 5:08:17 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load [datastore] INFORMACI?N: The backing store, C:\gcloud\emulators\datastore\WEB-INF\appengine-generated\local_db.bin, does not exist. It will be created. [datastore] nov 27, 2016 5:08:17 PM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround [datastore] INFORMACI?N: Unable to apply Java 7 long hostname workaround. [datastore] API endpoint: http://localhost:8806 [datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run: [datastore] [datastore] export DATASTORE_EMULATOR_HOST=localhost:8806 [datastore] [datastore] Dev App Server is now running. [datastore]

这是我尝试使用它时的堆栈跟踪:

java.lang.IllegalArgumentException: projectId must match the following pattern: ([a-z\d-]{1,100}~)?([a-z\d][a-z\d-.]{0,99}:)?([a-z\d][a-z\d-]{0,99}) at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122) at com.google.cloud.datastore.Validator.validateDatabase(Validator.java:42) at com.google.cloud.datastore.BaseKey$Builder.(BaseKey.java:58) at com.google.cloud.datastore.KeyFactory.(KeyFactory.java:35) at com.google.cloud.datastore.DatastoreHelper.newKeyFactory(DatastoreHelper.java:59) at com.google.cloud.datastore.DatastoreImpl.newKeyFactory(DatastoreImpl.java:371) at com.myproject.api.CronServlet.saveToDataStore(CronServlet.java:187) at com.myproject.api.CronServlet.doGet(CronServlet.java:105) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366) at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:511) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

编辑:代码(我没有包括因为我认为问题不在代码中,因为我部署并且它工作得很好)。在 'datastore.newKeyFactory()'

中引发异常
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
Key taskKey = datastore.newKeyFactory().setKind(ENTITY_TYPE_MEDIDAS).
    newKey(Calendar.getInstance(TimeZone.getTimeZone("CET")).getTimeInMillis());
Entity.Builder task = Entity.newBuilder(taskKey)
        .set(PROPERTY_COMPUESTO, DATA_COMPUESTO)
        .set(PROPERTY_AVISO,DATA_AVISO);
Entity entity = task.build();
datastore.put(entity);

不清楚您是在寻找连接到数据存储模拟器(用于开发)还是 Google 云平台上的真实数据存储的示例。看起来您的主要 objective 是从 IDE 调试您的代码,您可以采用任何一种方式。

关于连接到数据存储模拟器 - 请参阅下面的 post:

用于连接到 GCP 上的数据存储 -

如果您没有 运行 glcoud init 命令,运行 它并按照屏幕上的说明设置默认项目和身份验证凭据。然后你可以使用下面的代码访问真正的数据存储:

Datastore datastore = DatastoreOptions.getDefaultInstance().getService();

其他选项是使用 DatastoreOptions.Builder 在您的代码中设置项目 ID 和 Auth Credentials。您需要从 Google Cloud Console get/download JSON 凭据。

有关更多 info/sample 代码,请参阅以下链接:

https://github.com/GoogleCloudPlatform/google-cloud-java#specifying-a-project-id

https://github.com/GoogleCloudPlatform/google-cloud-java#authentication

我在同时使用 com.google.appengine.api.datastorecom.google.cloud.datastore

的项目中遇到问题

实际上,问题仅出在依赖于第二个库的方法中,所以我从我的项目中删除了 if,现在我可以 运行 我的本地数据存储。

也许有人觉得此信息有用。如果你想使用 com.google.cloud.datastore 你可以按照@Sai Pullabhotla 的回答。

另一方面,如果您使用 com.google.appengine.api.datastore,您甚至不需要启动 gcloud 工具。您只需要使用 appengine 的数据存储。

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();