调试 Google Datastore:IllegalArgumentException:projectId 必须与以下模式匹配

Jav*_*ado 5 java debugging google-app-engine datastore google-cloud-datastore

我正在开发一个应用程序引擎项目并使用 Google 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})

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n
\n

gcloud beta 模拟器数据存储启动 --project="my-project-name"

\n\n

警告:重用 [C:\\gcloud\\emulators\\datastore] 中的现有数据。\n 执行:cmd /c\n C:\\google-cloud-sdk\\platform\\cloud-datastore-emulator\\ cloud_datastore_emulator.cmd\n start --host=localhost --port=8806 --store_on_disk=True\n --consistency=0.9 --allow_remote_shutdown C:\\gcloud\\emulators\\datastore [数据存储] 2016 年 11 月 27 日 5 :08:17 PM\n com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$7\n 应用 [数据存储区] INFORMACI?N:提供了 --allow_remote_shutdown 来\n 不再需要的启动命令。[数据存储区] 2016 年 11 月 27 日\n 5:08:17 PM\n com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub \n [数据存储区] INFORMACI?N:已初始化本地数据存储区:[数据存储区]
\n 类型:高复制 [数据存储区] 存储:\n C:\\gcloud\\emulators\\datastore\\WEB-INF\\appengine- generated\\local_db.bin\n [数据存储区] 2016 年 11 月 27 日下午 5:08:17 \n io.grpc.internal.ManagedChannelImpl [数据存储] INFORMACI?N:\n [ManagedChannelImpl@5f71c76a] 使用目标 localhost 创建:8806\n [数据存储] 2016 年 11 月 27 日下午 5:08:17\n com.google。 cloud.datastore.emulator.impl.LocalDatastoreFileStub 加载\n [数据存储] INFORMACI?N:后备存储\n C:\\gcloud\\emulators\\datastore\\WEB-INF\\appengine- generated\\local_db。 bin,\n 不存在。它将被创建。[数据存储] 2016 年 11 月 27 日 5:08:17\n PM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround\n [数据存储] INFORMACI?N:无法应用 Java 7 长主机名\n 解决方法。[数据存储] API端点:http://localhost:8806 \n [datastore] 如果您使用的库支持\n DATASTORE_EMULATOR_HOST 环境变量,请运行:[datastore]\n [datastore] export DATASTORE_EMULATOR_HOST=localhost:8806\ n [数据存储] [数据存储] Dev App Server 正在运行。[数据存储]

\n
\n\n

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

\n\n
\n

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

\n
\n\n

编辑:代码(我没有包含\xc2\xb4t,因为我认为问题不在代码中,因为我部署并且它工作完美)。在“datastore.newKeyFactory()”中引发异常

\n\n
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();\nKey taskKey = datastore.newKeyFactory().setKind(ENTITY_TYPE_MEDIDAS).\n    newKey(Calendar.getInstance(TimeZone.getTimeZone("CET")).getTimeInMillis());\nEntity.Builder task = Entity.newBuilder(taskKey)\n        .set(PROPERTY_COMPUESTO, DATA_COMPUESTO)\n        .set(PROPERTY_AVISO,DATA_AVISO);\nEntity entity = task.build();\ndatastore.put(entity);\n
Run Code Online (Sandbox Code Playgroud)\n

Jav*_*ado 3

我在我的项目中遇到了一个问题,我同时使用了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();
Run Code Online (Sandbox Code Playgroud)