Java &引用;projectId必须与以下模式匹配;在Google Cloud tools for Eclipse上运行Objectify时出现异常

Java &引用;projectId必须与以下模式匹配;在Google Cloud tools for Eclipse上运行Objectify时出现异常,java,eclipse,google-cloud-platform,objectify,datastore,Java,Eclipse,Google Cloud Platform,Objectify,Datastore,我试图在Google Cloud上运行一个非常简单的hello world应用程序,使用objectify,但在尝试访问数据存储以保存实体时出现异常 我正在为eclipse(Oxygen4.7.3a)和Java8使用最新的Google云工具(1.6.1)。 按照官方指南,我能够创建一个标准java项目,并从eclipse在本地服务器上运行hello word示例应用程序。由于插件允许您将Objectify库添加到项目中,我决定尝试一下。下面是我为定义实体并尝试将其保存到数据存储中而编写的代码 /

我试图在Google Cloud上运行一个非常简单的hello world应用程序,使用objectify,但在尝试访问数据存储以保存实体时出现异常

我正在为eclipse(Oxygen4.7.3a)和Java8使用最新的Google云工具(1.6.1)。 按照官方指南,我能够创建一个标准java项目,并从eclipse在本地服务器上运行hello word示例应用程序。由于插件允许您将Objectify库添加到项目中,我决定尝试一下。下面是我为定义实体并尝试将其保存到数据存储中而编写的代码

//HelloAppEngine.java
package app;

import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.googlecode.objectify.ObjectifyService;
import static com.googlecode.objectify.ObjectifyService.ofy;

@WebServlet(
    name = "HelloAppEngine",
    urlPatterns = {"/hello"}
)
public class HelloAppEngine extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
      
      Car porsche = new Car("2FAST", 4);
      ofy().save().entity(porsche).now();    // async without the now()

      assert porsche.id != null;    // id was autogenerated

      Car fetched2 = ofy().load().type(Car.class).id(porsche.id).now();
      
    response.setContentType("text/plain");
    response.setCharacterEncoding("UTF-8");

    response.getWriter().print("Hello App Engine!\r\n");
    
    response.getWriter().print(porsche.id);
  }
  
  public void init()  {
      ObjectifyService.init();
      ObjectifyService.register(Car.class);
  }
}

//Car.java
package app;

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Index;

@Entity
public class Car {
    @Id Long id;
    @Index String license;
    int color;
    
    Car(String lic, int c) {
        license = lic;
        color = c;
    }
}
在localhost上以应用程序引擎标准运行项目时,我遇到以下异常:

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.<init>(BaseKey.java:58)
at com.google.cloud.datastore.KeyFactory.<init>(KeyFactory.java:35)
at com.google.cloud.datastore.DatastoreHelper.newKeyFactory(DatastoreHelper.java:58)
at com.google.cloud.datastore.DatastoreImpl.newKeyFactory(DatastoreImpl.java:466)
at com.googlecode.objectify.impl.Keys.createRawIncomplete(Keys.java:179)
at com.googlecode.objectify.impl.KeyMetadata.getIncompleteKey(KeyMetadata.java:184)
at com.googlecode.objectify.impl.KeyMetadata.setKey(KeyMetadata.java:153)
at com.googlecode.objectify.impl.KeyPopulator.save(KeyPopulator.java:29)
at com.googlecode.objectify.impl.translate.ClassPopulator.save(ClassPopulator.java:156)
at com.googlecode.objectify.impl.translate.ClassTranslator.saveSafe(ClassTranslator.java:131)
at com.googlecode.objectify.impl.translate.NullSafeTranslator.save(NullSafeTranslator.java:31)
at com.googlecode.objectify.impl.EntityMetadata.save(EntityMetadata.java:113)
at com.googlecode.objectify.impl.WriteEngine.save(WriteEngine.java:69)
at com.googlecode.objectify.impl.SaverImpl.entities(SaverImpl.java:60)
at com.googlecode.objectify.impl.SaverImpl.entity(SaverImpl.java:35)
at app.HelloAppEngine.doGet(HelloAppEngine.java:26)
java.lang.IllegalArgumentException:projectId必须匹配以下模式:([a-z\d\]{1100}~)?([a-z\d][a-z\d\.]{0,99}:)?([a-z\d][a-z\d\-]{0,99})
位于com.google.common.base.premissions.checkArgument(premissions.java:122)
位于com.google.cloud.datastore.Validator.validateDatabase(Validator.java:42)
位于com.google.cloud.datastore.BaseKey$Builder。(BaseKey.java:58)
位于com.google.cloud.datastore.KeyFactory(KeyFactory.java:35)
位于com.google.cloud.datastore.DatastoreHelper.newKeyFactory(DatastoreHelper.java:58)
位于com.google.cloud.datastore.DatastoreImpl.newKeyFactory(DatastoreImpl.java:466)
位于com.googlecode.objectify.impl.Keys.createRawComplete(Keys.java:179)
位于com.googlecode.objectify.impl.KeyMetadata.getIncompleteKey(KeyMetadata.java:184)
位于com.googlecode.objectify.impl.KeyMetadata.setKey(KeyMetadata.java:153)
在com.googlecode.objectify.impl.KeyPopulator.save(KeyPopulator.java:29)上
位于com.googlecode.objectify.impl.translate.ClassPopulator.save(ClassPopulator.java:156)
位于com.googlecode.objectify.impl.translate.ClassTranslator.saveSafe(ClassTranslator.java:131)
位于com.googlecode.objectify.impl.translate.NullSafeTranslator.save(NullSafeTranslator.java:31)
位于com.googlecode.objectify.impl.EntityMetadata.save(EntityMetadata.java:113)
位于com.googlecode.objectify.impl.WriteEngine.save(WriteEngine.java:69)
位于com.googlecode.objectify.impl.SaverImpl.entities(SaverImpl.java:60)
位于com.googlecode.objectify.impl.SaverImpl.entity(SaverImpl.java:35)
位于app.HelloAppEngine.doGet(HelloAppEngine.java:26)
你知道我在这里遗漏了什么吗?
只要我在本地开发服务器上运行,我就不需要项目id。

首先,正如您所发现的,在使用本地模拟器时,您确实需要提供项目id。你不能简单地忽略它。在月食中去 运行>运行配置>应用引擎>应用引擎本地服务器并选择运行配置的云平台选项卡。在该选项卡中,选择一个项目。这将指定要在本地运行中使用的项目ID。你选择哪个项目并不重要。你实际上不会连接到它

如果您没有登录或没有云项目,也可以在运行配置的环境选项卡中将GOOGLE_Cloud_Project环境变量设置为合法字符串,如MyProjectId

除此之外,Objectify 6.0似乎在使用dev_appserver中的捆绑数据存储模拟器时存在问题。它确实与基于测试版gcloud的数据存储模拟器配合使用。要使用它,请启动一个终端并运行

$ gcloud beta emulators datastore start
当emulator启动时,您将看到如下消息:

[datastore] API endpoint: http://localhost:8081
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=localhost:8081
[datastore] 
[datastore] Dev App Server is now running.
您需要将DATASTORE\u EMULATOR\u HOST环境变量添加到“环境”选项卡中的Eclipse运行配置中。在本例中,您将name设置为DATASTORE\u EMULATOR\u HOST,value设置为localhost:8081


首先,正如您所发现的,在使用本地仿真器时,确实需要提供项目ID。你不能简单地忽略它。在月食中去 运行>运行配置>应用引擎>应用引擎本地服务器并选择运行配置的云平台选项卡。在该选项卡中,选择一个项目。这将指定要在本地运行中使用的项目ID。你选择哪个项目并不重要。你实际上不会连接到它

如果您没有登录或没有云项目,也可以在运行配置的环境选项卡中将GOOGLE_Cloud_Project环境变量设置为合法字符串,如MyProjectId

除此之外,Objectify 6.0似乎在使用dev_appserver中的捆绑数据存储模拟器时存在问题。它确实与基于测试版gcloud的数据存储模拟器配合使用。要使用它,请启动一个终端并运行

$ gcloud beta emulators datastore start
当emulator启动时,您将看到如下消息:

[datastore] API endpoint: http://localhost:8081
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=localhost:8081
[datastore] 
[datastore] Dev App Server is now running.
您需要将DATASTORE\u EMULATOR\u HOST环境变量添加到“环境”选项卡中的Eclipse运行配置中。在本例中,您将name设置为DATASTORE\u EMULATOR\u HOST,value设置为localhost:8081


谢谢Elliotte,很抱歉我花了这么长时间检查和验证您的解决方案。是的,完全按照你的答案做确实解决了问题。当我比较Eclipse的旧Google插件和新的Google云工具时,似乎Google在简单性方面后退了一步。使用旧的插件,一切都是开箱即用的,现在我需要启动另一个模拟器服务来让它工作。谢谢Elliotte,很抱歉我花了这么长时间来检查和验证您的解决方案。是的,完全按照你的答案做确实解决了问题。当我比较Eclipse的旧Google插件和新的Google云工具时,似乎Google在简单性方面后退了一步。有了旧插件,一切都是开箱即用的,现在我需要启动另一个模拟器服务来让它工作。