Как создать объект com.google.appengine.api.datastore.Key в Google App Engine _ah/api/explorer?

У меня есть аннотированный объект GAE JDO:

@PersistenceCapable
public class HelloGreeting {

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key id;

  @Persistent
  private String message;

  ... constructors, getters, setters
}

и моя собственная конечная точка:

public HelloGreeting update(HelloGreeting helloGreeting)
        throws NotFoundException {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
        pm.getObjectById(HelloGreeting.class, helloGreeting.getId());
        ... some logic
    } finally {
        pm.close();
    }
    return helloGreeting;
}

где я хотел бы отправить из внешнего интерфейса или из Google App Engine _ah / api / explorer объект helloGreeting.

Когда я создаю один, используя pm.makePersistent(helloGreeting);Затем исследователь API показывает мне что-то вроде этого:

{
 "id": {
   "kind": "HelloGreeting",
   "appId": "project-id",
   "id": "5629499534213120",
   "complete": true
  },
"message": "some text"
}

Затем я использую эту структуру JSON для вызова update(HelloGreeting helloGreeting) метод через API-интерфейс, и я получаю следующую ошибку:

java.lang.NullPointerException at com.google.appengine.api.datastore.Key.getAppId(Key.java:279)
...
...

... который был из-за линии pm.getObjectById(HelloGreeting.class, helloGreeting.getId()); в моем update(HelloGreeting helloGreeting) метод.

Похоже, что поле идентификатора закрытого ключа не распаковано правильно. Я попробовал это также с pm.getObjectById(HelloGreeting.class, helloGreeting.getId().getId()); но безуспешно

Может кто-нибудь сказать мне, если это вообще возможно?

PS: я не могу изменить тип поля id с Key на Long (что работает), потому что тогда я не буду использовать внутренний дочерний объект с аннотацией @PersistenceCapable,

2 ответа

Я решил это с немного неприятным решением. Это мое update() конечная точка:

public HelloGreeting update(HelloGreeting helloGreeting)
        throws NotFoundException {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
        if(!containsGreeting(helloGreeting)) {
            throw new NotFoundException("not exists");
        }
        // persisting the helloGreeting with the new Key
        pm.makePersistent(helloGreeting);
    } finally {
        pm.close();
    }
    return helloGreeting;
}

private boolean containsGreeting(HelloGreeting helloGreeting) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    boolean contains = true;
    try {
        // here I'm creating a new Key from the helloGreeting
        Key key = KeyFactory.createKey(HelloGreeting.class.getSimpleName(), helloGreeting.getId().getId());
        // using the Key for a query
        pm.getObjectById(HelloGreeting.class, key);
        // and rewriting the old incorrect unmarshalled Key by the new one 
        helloGreeting.setId(key);
    } catch (javax.jdo.JDOObjectNotFoundException ex) {
        contains = false;
    } finally {
        pm.close();
    }
    return contains;
}

Если кто-то знает лучшее решение, я был бы признателен.

Я не уверен на 100% в вашем случае, но я думаю, что вам может понадобиться написать собственный преобразователь, чтобы убедиться, что ключ восстановлен правильно.

Другие вопросы по тегам