Nullpointerexception throws when inserting entity using Auto-generated Classendpoint insert method

时间秒杀一切 提交于 2020-01-21 07:04:15

问题


I am confused to using auto-generated endpoint class. I want to use generated endpoint to insert new object into datastore. But, an exception is throwing.

fooEndpoint.insertFoo(foo); // throws null pointer exception 

My entity class is similar with the given example at this source: https://developers.google.com/appengine/docs/java/datastore/jpa/overview.

Here is my entity:

@Entity
public class Foo {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Key ID;

Here is the stack trace:

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)

On the other side, I can insert new object when I use the EntityManager persist method. Because, this does not check exist or not on the datastore.

I expect that, classEndpoint insert method should save the object and assing auto key to ID field.

Or I need to initialize the ID field.

Here is auto-generated endpoint class insertFoo method.

  /**
 * 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;
}

Here is the containsFoo method

    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() is null. Because, it is new object. I am expecting that, app engine creates a key for it. Or I need to explicitly create a key for it?

Other fields in Foo class are simple types such as String and booleans.

Thanks for your time.


回答1:


I had exactly the same problem. I will present the way I worked around it.

Original auto-generated Endpoints class relevant code:

private boolean containsFoo(Foo foo) {
    EntityManager mgr = getEntityManager(); 
    boolean contains = true;
    try {
        Foo item = mgr.find(Foo.class, foo.getID());
        if (item == null) {
            contains = false;
        }
    } finally {
        mgr.close();
    }
    return contains;
}

Changed relevant code to include a null check for the entity object that is passed as an argument.

private boolean containsFoo(Foo foo) {
    EntityManager mgr = getEntityManager(); 
    boolean contains = true;
    try {
        // If no ID was set, the entity doesn't exist yet.
        if(foo.getID() == null)
            return false;
        Foo item = mgr.find(Foo.class, foo.getID());
        if (item == null) {
            contains = false;
        }
    } finally {
        mgr.close();
    }
    return contains;
}

This way it will work as supposed, although I'm confident that more experienced answers and explanations will appear.




回答2:


I was having the same exact problem after using the Eclipse Plugin to autogenerate the cloud endpoints (by selecting "Google > Generate Cloud Endpoint Class").

Following your advice, I added:

if(foo.getID() == null) // replace foo with the name of your own object return false;

The problem was solved.

How is that Google hasn't updated the autogenerated code yet as this must be a highly recurring issue?

Thanks for the solution.



来源:https://stackoverflow.com/questions/15226793/nullpointerexception-throws-when-inserting-entity-using-auto-generated-classendp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!