Исключение «projectId должен соответствовать следующему шаблону» при запуске Objectify в инструментах Google Cloud для Eclipse - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь запустить очень простое приложение hello world в Google Cloud с objectify, но получаю исключение при попытке доступа к хранилищу данных для сохранения сущности.

Я использую новейшие инструменты Google Cloud Tools (1.6.1) для eclipse (Oxygen 4.7.3a) и Java 8. Следуя официальному руководству Google quick star , я смог создать стандартный проект java и запустить приложение приветствия в виде слов на моем локальном сервере из 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 на 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)

Есть идеи, что мне здесь не хватает?AFAIK, пока я работаю на локальном сервере разработчика, мне не нужен идентификатор проекта.

1 Ответ

0 голосов
/ 22 мая 2018

Во-первых, вам нужно указать идентификатор проекта при работе с локальным эмулятором, как вы обнаружили.Вы не можете просто опустить это.В Eclipse перейдите к Выполнить> Выполнить конфигурации> App Engine> Локальный сервер App Engine и выберите вкладку Cloud Platform вашей конфигурации запуска.На этой вкладке выберите проект.Это назначит идентификатор проекта для использования в локальном прогоне.Неважно, какой проект вы выберете.Вы на самом деле не будете подключаться к нему.

В качестве альтернативы, если вы не вошли в систему или у вас нет облачного проекта, вы можете вместо этого установить для переменной среды GOOGLE_CLOUD_PROJECT допустимую строку, такую ​​как MyProjectId, на вкладке среды конфигурации запуска.

Кроме того, в Objectify 6.0, похоже, есть проблема при работе со встроенным эмулятором хранилища данных в dev_appserver.Он работает с эмулятором хранилища данных на основе бета-версии 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 на вкладке Environment.В этом примере вы задали бы имя DATASTORE_EMULATOR_HOST и значение localhost: 8081.

enter image description here

...