0

过去几个月我一直在使用 GWT,我需要开始工作的最后一件事是使用 GAE 而不是 SQLITE 将我的应用程序数据存储在 JDO 对象中。
我的应用程序成功地将对象(在本例中为论坛主题)保存到数据存储区(我已在 appspot/appengine 日志查看器中确认了这一点)。当我像这样对主题 ID 进行硬编码时,我设法获取了其中一个对象:

 pManager.getObjectById(Topic.class, 1);

但是,当我尝试使用 Query 类并获取包含所有主题的 List 时,我从 execute 方法中得到的所有内容都是空的。如果我清除主题的数据存储区,我可以打印结果列表的大小(因此它不应该为空),但是当数据存储区中有主题时,它总是会生成List<Topic> null.

这是有问题的代码:

// Fetches all Topic-objects from the App Engine storage and 
// puts them in an ArrayList that is returned.
public ArrayList<Topic> getAllTopics() {

    ArrayList<Topic> queryResults = new ArrayList<Topic>();
    PersistenceManager pManager = PMF.get().getPersistenceManager();
    pManager.getFetchPlan().setGroup(FetchGroup.ALL);
    Query topicQuery = pManager.newQuery(Topic.class);

    // Does not make any difference what query I use
    //Query topicQuery = pManager.newQuery(Topic.class);

    Topic newTopic = null;
    try {
        System.out.println("Will now try to execute the query...");
        List<Topic> results = (List<Topic>)topicQuery.execute();
        System.out.println("Result size: " + results.size());
        System.out.println("Query now done executing.");
        for (Topic t : results) {
            // Does not seem to make any difference either
            //      newTopic = pManager.detachCopy(t);
            //      queryResults.add(newTopic);
            queryResults.add(t);
        }
        // I can fetch one topic when hard-coding the ID.
        //      queryResults.add(pManager.getObjectById(Topic.class, 1));
    } catch(Exception e) {
        System.out.println("Exception when getting all topics on server: " + e.getMessage() + " - ");
        System.out.print( e.getStackTrace());
    } finally {
        topicQuery.closeAll();
        pManager.close();
    }   


    return queryResults;
}

这是使主题对象持久化的代码:

    // Creates a topic object and stores it in App Engine
// Returns true if it succeeded, otherwise false
public Boolean createTopic(String title_, String text_) {

    PersistenceManager pManager = PMF.get().getPersistenceManager();
    UserAuthImpl newUserAuth = new UserAuthImpl();

    if(newUserAuth.returnUser().isEmpty() || newUserAuth.returnUser() == null ) 
        return false;

    Topic newTopic = new Topic(newUserAuth.returnUser(), title_, text_, new Date(Calendar.getInstance().getTimeInMillis()));

    try {
        // Did not help: pManager.setDetachAllOnCommit(true);
        pManager.makePersistent(newTopic);
    } catch(Exception e) {
        System.out.println("Error while creating topic: " + e.getMessage());
        return false;
    } finally {
        pManager.close();
    }
    return true;
}

这是主题对象类:

package se.biffnet.tddi15.forum.client;

import java.io.Serializable;

import java.util.Date;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Topic implements Serializable {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long    topicID;

@Persistent
String  authorID;

@Persistent
String  postTitle;

@Persistent
String  postText;

@Persistent
Date    postDate;

public Topic(String authorID_, String postTitle_, String postText_, 
        java.util.Date date) {
    authorID    = authorID_;
    postTitle   = postTitle_;
    postText    = postText_;
}

public Topic() {
    authorID    = "";
    postTitle   = "";
    postText    = "";
    postDate    = null;
}

public String getPostTitle() {
    return postTitle;
}

public void setPostTitle(String postTitle) {
    this.postTitle = postTitle;
}

public String getPostText() {
    return postText;
}

public void setPostText(String postText) {
    this.postText = postText;
}

public long getTopicID() {
    return topicID;
}

public String getAuthorID() {
    return authorID;
}

public Date getPostDate() {
    return postDate;
    } 
}

所以我想问题是:
为什么execute()总是返回null?非常感谢您的帮助 =)

EDIT2:必须更改 logging.properties 才能看到调试消息。这是我的错。日志太大,无法在此处发布,因此这里是 pastebin 的链接:http: //pastebin.com/CGX1Aug0

EDIT3:异常及其堆栈跟踪:

java.lang.NullPointerException: null
com.google.appengine.datanucleus.query.QueryEntityPKFetchFieldManager.fetchLongField(QueryEntityPKFetchFieldManager.java:74)
org.datanucleus.identity.IdentityUtils.getApplicationIdentityForResultSetRow(IdentityUtils.java:101)
com.google.appengine.datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1011)
com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:229)
com.google.appengine.datanucleus.query.DatastoreQuery$2.apply(DatastoreQuery.java:226)
com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96)
com.google.appengine.datanucleus.query.LazyResult$LazyAbstractListIterator.computeNext(LazyResult.java:229)
com.google.appengine.datanucleus.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:131)
com.google.appengine.datanucleus.query.AbstractIterator.hasNext(AbstractIterator.java:126)
com.google.appengine.datanucleus.query.LazyResult$AbstractListIterator.hasNext(LazyResult.java:183)
se.biffnet.tddi15.forum.server.DbHandlerImpl.getAllTopics(DbHandlerImpl.java:75)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:167)
java.security.AccessController.doPrivileged(Native Method)
com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:164)
com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:125)
com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:43)
com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:57)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
org.mortbay.jetty.Server.handle(Server.java:326)
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438)
com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480)
com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487)
com.google.tracing.TraceContext.runInContext(TraceContext.java:774)
com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751)
com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342)
com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334)
com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484)
com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
java.lang.Thread.run(Thread.java:722)
4

0 回答 0