Automatische ID IdGeneratorStrategy generieren

8

Ich verwende Goole App Engine zum Erstellen meiner REST-API. Ich habe meine Klasse bereits als PersistenceCapable markiert und auch meinen @PrimaryKey definiert und markiert als @Persistent (valueStrategy = IdGeneratorStrategy.IDENTITY) , habe ich auch schon EndPoints generiert. aber wenn ich das terminal-Fenster ein curl-Befehl einfüge, um eine neue Entität oder Registrierung einzufügen, funktioniert es nicht. Das ist der Code:

%Vor%

Dies ist der curl-Befehl und die Antwort von meinem lokalen Server. wenn ich versuche, eine neue Entität einzufügen

%Vor%

und dies ist die Antwort vom lokalen Server.

%Vor%

Ich habe gedacht, dass ID automatisch erstellt wurde eingefügt. aber das passiert hier nicht. Anders als beim Einfügen einer ID zusammen

  1. sind meine Klasse falsch?
  2. sind meine POST / JSON Anfrage Ok?

Vielen Dank im Voraus.

    
AlexSanchez 20.02.2013, 02:56
quelle

3 Antworten

8

Ich denke, dass ich die Lösung gefunden habe. Es scheint, dass jeder von Google App Engine (GAE) generierte Endpunkt über eine einfache Methode verfügt, die jedes Mal prüft, wenn jemand versucht, eine persistente Instanz einzufügen oder zu aktualisieren, also jedes Mal, wenn ich versucht habe, eine neue Instanz einzufügen Schüler, der curl / json verwendet, ohne die neue ID für die Instanz anzugeben, in der eine Fehlermeldung wie diese angezeigt wird:

%Vor%

Ich habe das Problem beim Bearbeiten meiner Endpunktklasse gelöst, indem ich überprüft habe, ob das neue Objekt (vom curl-Befehl und vom Wrapped-JSON-Format) einen Nicht-Null-ID-Wert hat, bevor Sie mit diesem Code prüfen, ob das Objekt zuvor gespeichert wurde:

%Vor%

Soweit ich keine Dokumentation gesehen habe, die diesen Aspekt für mich klären kann. Außerdem habe ich viel Zeit damit verbracht, die Dokumentation zu GAE zu lesen versuchen herauszufinden, was passiert ist.

All das brachte mich dazu zu denken, dass vielleicht nur die GAE-Dokumentation nicht aktuell ist oder ich wahrscheinlich nicht genug suchen kann, wenn jemand davon weiß. lass es mich wissen und das allgemeine Wissen wachsen. Danke @DataNucleus.

HINWEIS: "Diese Gabelung, die ich gemacht habe, sollte nicht als richtige Antwort genommen werden, sie könnte Sie zu unerwartetem Verhalten Ihrer App führen."

    
AlexSanchez 22.02.2013 00:12
quelle
1

Das Problem liegt in der Methode contains des Endpunkts, der automatisch generiert wurde. Die ausgelöste Ausnahme ist javax.jdo.JDOFatalInternalException, wenn die ID null ist und die Methode die Ausnahme javax.jdo.JDOObjectNotFoundException abfängt.

Die Ausnahme wird nie abgefangen und Sie erhalten den Fehler. Ich tue nicht, wenn es ein Bug oder was ist, aber nach der Aktualisierung der catch-Anweisung, um beide zu fangen, wurde das Problem gelöst.

Ich hoffe, es hilft!

    
matiaslezin 15.07.2014 19:11
quelle
0

Wie in der Antwort von AlexSanchez angemerkt, erwartet der generierte Endpunktcode, dass der Primärschlüssel bereits beim Einfügen neuer Identitäten gesetzt ist.

Während einige dies als Fehler betrachten, können andere dies als Feature betrachten, da der Client den Schlüssel irgendwie erzeugen muss (z. B. indem er eine zufällige Uuid erzeugt, wenn der Schlüsseltyp String ist). Auf diese Weise kann der Client auch offline einen vollständigen Graphen von Entitäten erstellen und diese online auf den Server hochladen.

(Ich denke, das Spine-Framework ist ein Beispiel für diese Idee: Ссылка .)

    
Marc 26.05.2013 12:00
quelle