Clientside错误(无法调用null参数的方法'nullMethod':nullMethod)

时间:2011-08-10 02:58:12

标签: facebook google-app-engine gwt rpc

我的应用程序引擎/ GWT项目每次尝试从我的登录方法返回时都会吐出一堆令人讨厌的堆栈跟踪。我使用GAE版本1.5.0和GWT版本2.3.0。

这是一个Facebook应用程序,所以我得到的是:

  • 玩家导航到应用页面。
  • 他们点击按钮,然后重定向到OAuth身份验证页面
  • 然后将它们重定向回应用程序,并在查询字符串中使用身份验证令牌
  • 我将查询字符串分开以获取UID,然后将其用作我的Player实体的主键(RPC to app engine backend)
  • 我从数据存储中检索Player实体实例,并将其转换为可序列化类型以返回到客户端
  • 史诗失败。

当我在JSAlert中吐出异常时,我得到了一堆令人讨厌的堆栈跟踪(我已经足够周到地使用“漂亮”而不是“混淆”进行编译)。

我的登录功能如下:

@Override
public ClientPlayer login(String uid) {
    PersistenceManager pm=PMF.get().getPersistenceManager();
    log.warning(Player.class.getName());
    log.warning(uid);
    Key k=KeyFactory.createKey(Player.class.getSimpleName(), uid);
    Player p;
    List<List<Integer>> stats;
    try{
        p=pm.getObjectById(Player.class, k);
    } catch (JDOObjectNotFoundException e){
        p=new Player(uid);
        p.setKey(k);
        pm.makePersistent(p);
    } finally {
        pm.close();
    }
    stats=p.getStats();
    return new ClientPlayer(p.getUID(),p.getPerm(), p.getDecks(),stats.get(0), stats.get(1), stats.get(2));
}

不幸的是,由于NDA,我无法链接到该应用,但这是输出:

    Failure to log in because of: 
    com.google.gwt.core.client.JavaScriptException: (TypeError): Cannot call method 'nullMethod' of null
     arguments: nullMethod,
     type: non_object_property_call
     stack: TypeError: Cannot call method 'nullMethod' of null
        at Object.ClientPlayer_1 (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:993:89)
        at Object.ClientPlayer_0 (http://*com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:984:18)
        at Array.instantiate_1 [as 0] (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:1031:10)
        at $instantiate_0 (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10660:34)
        at $instantiate (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:1948:10)
        at $readObject (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10148:95)
        at Object.read_8 [as read] (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10608:10)
        at $onResponseReceived (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10352:247)
        at $fireOnResponseReceived (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:5002:5)
        at Object.onReadyStateChange (http:/*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:5222:5)

1 个答案:

答案 0 :(得分:1)

问题在于使用IsSerializable界面,或者说我对它的理解不够。

创建IsSerialiazable对象时,它需要一个无参数构造函数。我将null值从该构造函数传递给主构造函数,因此在对它们调用方法时,会发生空指针异常。这对我来说是愚蠢的,但是嘿,这是一次学习经历。

在我的特定情况下,它有点像这样......

public class ClientObject implements IsSerializable {
    private Object field1;
    private Object field2;
    private String field3;

    public ClientObject(){
        this(null, null);
    }
    public ClientObject(Object arg1, Object arg2){
        field1=arg1;
        field2=arg2;
        field3=arg1.toString()+arg2.toString(); 
        //Error on above line, though not obviously mentioned in the message
    }
}

本应该做的是......

public ClientObject(){
    this(new Object(), new Object());
}

希望这有助于某人。