簡體   English   中英

在針對Eclipse的Google Cloud工具上運行Objectify時出現“ projectId必須與以下模式匹配”異常

[英]“projectId must match the following pattern” exception when running Objectify on Google Cloud tools for Eclipse

我正在嘗試使用objectify在Google Cloud上運行一個非常簡單的hello world應用程序,但是在嘗試訪問數據存儲以保存實體時遇到異常。

我將最新的Google Cloud Tools(1.6.1)用於Eclipse(Oxygen 4.7.3a)和Java8。按照官方的Google快速星空指南,我能夠創建標准的Java項目並在我的應用程序上運行hello word示例應用程序eclipse的本地服務器。 由於插件允許您將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;
    }
}

在本地主機上以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。

首先,正如您所發現的,在使用本地仿真器時,您確實需要提供一個項目ID。 您不能簡單地忽略它。 在Eclipse中,轉到運行>運行配置> App Engine> App Engine本地服務器,然后選擇運行配置的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.

您需要在“環境”選項卡中將DATASTORE_EMULATOR_HOST環境變量添加到Eclipse運行配置中。 在此示例中,您將名稱設置為DATASTORE_EMULATOR_HOST,並將值設置為localhost:8081。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM