2

我正在开发一个appengine项目并使用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})调试Google数据存储:IllegalArgumentException:projectId必须匹配以下模式

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

要允许调试,我按照数据存储模拟器的指令:

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

我已经安装了谷歌云SDK,我开始它correcty使用我的项目ID的默认值(和我有也尝试通过命令行设置我自己的项目ID)。

这是我在gcloud正在执行命令:

gcloud测试模拟器的数据存储开始--project =“我的项目名称”

警告:[C重用现有的数据: \ gcloud \模拟器\数据存储区。 执行: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 $ 7 apply [datastore] INFORMACI?N:提供 - -allow_remote_shutdown至 启动命令,不再需要。 [数据存储] 2016年11月27日 下午5点08分17秒 com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub [数据存储] INFORMACI N:?本地数据存储初始化:[数据存储]
类型:高复制[数据存储]存储: C:\ gcloud \ emulators \ datastore \ WEB-INF \ appengine生成的\ local_db.bin [datastore] nov 27,2016 5:08:17 PM io.grpc.internal.ManagedChannelImpl [datastore] INFORMACI N:? [ManagedChannelImpl @ 5f71c76a]建立与目标本地主机:8806 [数据存储] 2016年11月27日下午5点08分17秒 com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub负载 [数据存储] INFORMACI ?N:后台商店, C:\ gcloud \ emulators \ datastore \ WEB-INF \ appengine-generated \ local_db.bin, 不存在。它将被创建。 [datastore] nov 27,2016 5:08:17 PM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround [datastore] INFORMACI?N:无法应用Java 7长主机名 解决方法。 [数据存储] API端点:http://localhost:8806 [数据存储]如果您使用的是支持的 DATASTORE_EMULATOR_HOST环境变量库,运行:[数据存储] [数据存储]出口DATASTORE_EMULATOR_HOST =本地主机:8806 [数据存储] [数据存储]开发应用服务器现在正在运行。 [数据存储]

这是堆栈跟踪,当我尝试使用它:

java.lang.IllegalArgumentException异常:专案编号必须在下列 模式相匹配: (即[az \ d - ] { 1100}〜)([AZ \ d] [AZ \ d - ] {0,99} :)?([az \ d] [az \ 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) 在 com.google.cloud.datastore.DatastoreHelper.newKeyFactory(DatastoreHelper.java:59) 在 com.google.cloud.datastore.DatastoreImpl.newKeyFactory(DatastoreImpl.java:371) 在 com.myproject.api .CronServlet.saveToDataStore(CronServlet.java:187) at com.myproject.api.CronServlet.d oGet(CronServlet.java:105) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)at org.mortbay。 jetty.servlet.ServletHolder.handle在 org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.socket(ServletHolder.java:511) 。 dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 在 org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.ResponseRewriterFilter。 doFilter(ResponseRewriterFilter.java:128) at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter在 org.mortbay在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)(ServletHandler.java:1157) .jetty.servlet.ServletHandler $ CachedChain.doFilter在 org.mortbay.jetty在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)(ServletHandler.java:1157) .servlet.ServletHandler $ CachedChain.doFilter在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50)(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter在 org.mortbay在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)(ServletHandler.java:1157) .jetty.servlet.ServletHandler $ CachedChain.doFilter在 com.google.appengine.tools在 com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)(ServletHandler.java:1157) .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在 org.mortbay.jetty在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)(ServletHandler.java:1157) .security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler中的.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext。的java:98) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService.java:511) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在org.mortbay.jetty.Server.handle(Server.java:326)在 org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:923) 在org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)在 组织。 mortbay.jetty.HttpParser.parseAvailable(H ttpParser.java:212)处 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)在 org.mortbay .thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

编辑:代码(我didn't包括因为我觉得这个问题是不是在代码中,我部署和它完美的作品)。唯一的例外是在提出“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); 
+0

请张贴代码。 –

+0

好像你在你的项目ID中有非法字符。你可以发布它看起来像什么格式吗? – atimothee

+0

添加了代码,但它在部署时起作用。项目ID的格式是“某事”,它与正则表达式匹配。我认为我的项目没有在任何地方找到项目ID。 –

回答

1

我曾在我的项目的问题,我用两个com.google.appengine.api.datastorecom.google.cloud.datastore

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

也许有人认为此信息有用。如果您想使用com.google.cloud.datastore,你可以关注@Sai Pullabhotla的回答。

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

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
3

,如果你正在寻找一个例子给连接到数据存储仿真器(发展),或在谷歌云平台实时数据存储目前尚不清楚。看起来你的主要目标是从一个IDE中调试你的代码,你可以这样做。

用于连接到数据存储模拟器 - 看到下面的帖子:

Google Datastore Emulator using Java (Not using GAE)

用于连接到数据储存GCP -

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

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

其他选项是设置使用DatastoreOptions.Builder你的代码中的项目编号和验证凭证。您需要从Google云端控制台获取/下载JSON凭证。

请参见下面的链接,了解更多信息/示例代码:

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

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

+0

谢谢你的回答。这个答案对很多人很有用,但是我已经为使用appengine Datastore的人添加了我自己的答案,以便他们可以选择他们自己的答案。 –

+0

我认为这是正确的道路。因为抛出无用的错误而在Google上感到羞耻。它应该是“未认证”或什么的。 – Robert