![](/img/trans.png)
[英]Debugging Google Datastore: IllegalArgumentException: projectId must match the following pattern
[英]“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.