Как создать объект 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% в вашем случае, но я думаю, что вам может понадобиться написать собственный преобразователь, чтобы убедиться, что ключ восстановлен правильно.