" projectId必须符合以下模式"在用于Eclipse的Google Cloud工具上运行Objectify时的例外情况

时间:2018-05-21 20:27:10

标签: java eclipse google-cloud-platform objectify datastore

我试图在客户端上运行一个非常简单的hello world应用程序,但在尝试访问数据存储区以保存实体时会遇到异常。

我正在使用最新的Google Cloud Tools(1.6.1)进行eclipse(Oxygen 4.7.3a)和Java 8。 在官方的Google quick star指南之后,我能够创建一个标准的java项目,并在我的本地服务器上运行来自eclipse的hello word sample app。由于该插件允许您将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上以App Engine标准运行项目时,我遇到以下异常:

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)

知道我在这里缺少什么吗? AFAIK,只要我在本地开发服务器上运行,我就不需要项目ID。

1 个答案:

答案 0 :(得分:2)

首先,您需要在使用本地模拟器时提供项目ID,如您所发现的那样。你不能简单地省略它。在Eclipse中去 运行&gt;运行配置&gt; App Engine&gt; App Engine Local Server ,然后选择运行配置的 Cloud Platform 标签。在该选项卡中,选择一个项目。这将指定要在本地运行中使用的项目ID。选择哪个项目无关紧要。你实际上不会连接到它。

作为替代方案,如果您未登录或没有Cloud Project,则可以在运行配置的环境选项卡中将GOOGLE_CLOUD_PROJECT环境变量设置为合法字符串,例如MyProjectId。

除此之外,Objectify 6.0似乎在dev_appserver中使用捆绑数据存储模拟器时遇到问题。它适用于基于beta gcloud的数据存储模拟器。要使用它,请启动终端并运行

$ gcloud beta emulators datastore start

当模拟器启动时,您将看到如下消息:

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

您需要在Environment选项卡中将DATASTORE_EMULATOR_HOST环境变量添加到Eclipse运行配置中。在此示例中,您将名称设置为DATASTORE_EMULATOR_HOST,并将值设置为localhost:8081。

enter image description here