Обективизирайте с облачни крайни точки

Използвам облачни крайни точки на appengine и обективизирам. Преди съм разполагал тези крайни точки преди и сега ги актуализирам и не работи с Objectify. Преместих се на нова машина и използвам най-новия appengine 1.8.6. Опитах да сложа objectify в classpath и това не проработи. Знам, че това може да работи, какво пропускам??

Когато стартирате endpoint.sh:

Error: Parameterized type
   com.googlecode.objectify.Key<MyClass> not supported.

АКТУАЛИЗАЦИЯ: Върнах се към стария си компютър и стартирах endpoints.sh на същата крайна точка и работи добре. Старата машина е с 1.8.3. Използвам objectify 3.1.

АКТУАЛИЗАЦИЯ 2: Актуализирах старата си машина до 1.8.6 и получавам същата грешка като друга машина. Оставя 2 възможности: 1) Крайните точки вече не поддържат objectify 3.1 или 2) Крайните точки имат грешка в най-новата версия

Най-вероятно #1...все пак възнамерявах да актуализирам до 4.0...


person Patrick    schedule 31.10.2013    source източник


Отговори (4)


Поради популярността на Objectify, в предишни версии беше добавено заобиколно решение за поддръжка на типа Key, докато не беше налично по-общо решение. Тъй като новото решение е налично, заобиколното решение е премахнато. Сега има два начина, по които можете да подходите към проблема с имота.

  1. Добавете @ApiResourceProperty анотация, която кара ключът да бъде пропуснат от вашия обект по време на сериализиране. Използвайте този подход, ако искате просто решение и не се нуждаете от достъп до ключа във вашите клиенти.
  2. Добавете @ApiTransformer анотация, която предоставя съвместим механизъм за сериализиране/десериализиране на полето. Използвайте този подход, ако имате нужда от достъп до ключа (или негово представяне) във вашите клиенти. Тъй като това изисква писане на клас трансформатор, това е повече работа от първия вариант.
person Dan Holevoet    schedule 31.10.2013
comment
Здравей Дан, несвързано, попаднах на този въпрос относно ограниченията с Google Cloud Endpoints, чудя се дали все още са налице, отговорът би бил добър stackoverflow.com/questions/19786339/ - person ZiglioUK; 12.11.2013
comment
@Sti искаш да кажеш повторно добавяне на явен манипулатор за Objectify Keys? Не мисля така. Общото решение решава както случая с Objectify, така и всички други. - person Dan Holevoet; 21.01.2014
comment
Нуждаем се от достъп до идентификатора на обекта в нашата iOS крайна точка. Вашето първо решение напълно игнорира това поле. Доколкото виждаме, второто решение преобразува целия обект, а не само полето, както казвате. Има ли начин да конвертирате само свойството Key, така че крайната точка да има достъп до него? - person Sti; 23.01.2014
comment
Бихте ли говорили за плюсовете и минусите на всяко от двете решения? - person clocksmith; 11.02.2014
comment
@clocksmith Добавих няколко изречения за това. PTAL - person Dan Holevoet; 11.02.2014
comment
@DanHolevoet Благодаря. Изглежда, че имам нужда от опция 2, тъй като имам достъп до ключове (потребителски идентификатори) на клиента. - person clocksmith; 12.02.2014
comment
Приложих трансформатор за класа, който хвърляше грешката. Все още получавам същата грешка. Всъщност съм малко объркан. Класът не се ли сериализира в JSON по кабела? Какво прави предоставянето на друг метод за сериализиране и как трябва да реши проблема, описан в OP? Благодаря - person clocksmith; 12.02.2014
comment
@clocksmith Да, класът е сериализиран в JSON по кабела. Трансформаторът подпомага процеса на сериализация на JSON, като описва трансформация за полета, които иначе не могат да бъдат сериализирани. В случай на ключове Objectify, специфични за рамката знания са необходими за извършване на сериализацията, поради което имахме заобиколно решение преди общото решение. Ако имате проблем с поведението на вашия трансформатор, мисля, че е достатъчно различно от този въпрос, за да го зададете отделно в нова тема. - person Dan Holevoet; 13.02.2014
comment
Можете ли да публикувате кода за трансформатора? - person azyoot; 09.03.2014
comment
@DanHolevoet Това решение не работи. Трансформаторите не работят с параметризирани типове, така че освен ако не искате да имате Key, а не Key‹MyClass› във вашите обекти, нямате късмет. - person Alex Churchill; 26.11.2014

Измислих следното решение за моя проект:

@Entity
public class Car {

    @Id Long id;

    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
    Key<Driver> driver;

    public Key<Driver> getDriver() {
        return driver;
    }

    public void setDriver(Key<Driver> driver) {
        this.driver = driver;
    }

    public Long getDriverId() {
        return driver == null ? null : driver.getId();
    }

    public void setDriverId(Long driverId) {
        driver = Key.create(Driver.class, driverId);
    }
}

@Entity
public class Driver {
    @Id Long id;
}

Знам, че е малко шаблонно, но хей - работи и добавя някои удобни методи за бърз достъп.

person Flori    schedule 27.09.2014
comment
Можете да преместите @ApiResourceProperty в полето, за да спестите малко бъркотия - person Mark Renouf; 06.01.2015

Първоначално не разбрах отговора, даден от Флори, и колко полезен е всъщност. Тъй като други може да се възползват, ще дам кратко обяснение.

Както беше обяснено по-рано, можете да използвате @ApiTransformer, за да дефинирате трансформатор за вашия клас. Това би трансформирало несериализирано поле, като тези от тип Key<myClass>, в нещо друго, като Long.

Оказва се, че когато даден клас се обработва от GCE, методите, наречени get{fieldName} и set{FieldName}, се използват автоматично за трансформиране на полето {fieldName}. Не можах да намеря това никъде в документацията на Google.

Ето как го използвам за свойството Key{Machine} в моя Exercise клас:

public class Exercise {
  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  public Key<Machine> machine;
  // ... more properties

  public Long getMachineId() {
    return this.machine.getId();
  }

  public void setMachineId(Long machineId) {
    this.machine = new Key<Machine>(Machine.class, machineId);
  }

  // ...
}
person rakensi    schedule 23.08.2015

Други вече споменаха как да подходим към това с @ApiResourceProperty и @ApiTransformer. Но имам нужда от наличния ключ от страната на клиента и не искам да трансформирам целия обект за всеки един. Опитах се да заменя ключа Objectify с com.google.appengine.api.datastore.Key и изглежда, че работи добре и в моя случай, тъй като проблемът тук се дължи главно на това, че крайната точка не поддържа параметризирани типове.

person Vin    schedule 10.03.2016