Sono confuso nell'utilizzo della classe dell'endpoint generato automaticamente. Voglio utilizzare l'endpoint generato per inserire un nuovo oggetto in archivio dati. Ma, un'eccezione sta lanciando.L'eccezione di punto nullo viene generata quando si inserisce un'entità utilizzando il metodo di inserimento del Classendpoint generato automaticamente
fooEndpoint.insertFoo(foo); // throws null pointer exception
La mia classe di entità è simile con l'esempio dato a questa fonte: https://developers.google.com/appengine/docs/java/datastore/jpa/overview.
Ecco il mio soggetto:
@Entity
public class Foo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key ID;
Ecco la traccia dello stack:
java.lang.NullPointerException
at org.datanucleus.api.jpa.JPAEntityManager.find(JPAEntityManager.java:318)
at org.datanucleus.api.jpa.JPAEntityManager.find(JPAEntityManager.java:256)
at com.FooEndpoint.containsFoo(FooEndpoint.java:150)
at com.FooEndpoint.insertFoo(FooEndpoint.java:96)
Dall'altro lato, posso inserire un nuovo oggetto quando uso il metodo persistente EntityManager. Perché, questo non verifica esistere o meno sul datastore.
Mi aspetto che, il metodo di inserimento di classEndpoint dovrebbe salvare l'oggetto e assegnare la chiave automatica al campo ID.
Oppure ho bisogno di inizializzare il campo ID.
Qui è il metodo insertFoo della classe dell'endpoint generato automaticamente.
/**
* This inserts a new entity into App Engine datastore. If the entity already
* exists in the datastore, an exception is thrown.
* It uses HTTP POST method.
*
* @param foo the entity to be inserted.
* @return The inserted entity.
*/
public Foo insertFoo(Foo foo) {
EntityManager mgr = getEntityManager();
try {
if (containsFoo(foo)) {
throw new EntityExistsException("Object already exists");
}
mgr.persist(foo);
} finally {
mgr.close();
}
return foo;
}
Ecco il metodo containsFoo
private boolean containsFoo(Foo foo) {
EntityManager mgr = getEntityManager();
boolean contains = true;
try {
Foo item = mgr.find(Foo.class, foo.getID()); // exception occurs here
if (item == null) {
contains = false;
}
} finally {
mgr.close();
}
return contains;
}
foo.getID() è nullo. Perché, è un nuovo oggetto. Mi aspetto che, il motore di app crea una chiave per questo. O ho bisogno di creare esplicitamente una chiave per questo?
Altri campi in classe Foo sono tipi semplici come String e booleani.
Grazie per il vostro tempo.
È possibile fornire l'origine per il metodo 'insertFoo'? Cosa stai passando come "pippo"? –
Mi rendo conto che la vecchia versione del metodo di inserimento del generatore di endpoint cloud è diversa dalla nuova versione. Perché, il metodo insert alla vecchia versione rende persistente l'oggetto senza controllo di esistenza (contiene metodo). Ma i nuovi controllano l'esistenza dell'oggetto. Ma, se la chiave è nullo, viene lanciata un'eccezione. Per favore, questo caso è normale o no? – retto