Ошибка на стороне клиента (Невозможно вызвать метод 'nullMethod' с нулевыми аргументами: nullMethod) - PullRequest
1 голос
/ 10 августа 2011

Мой движок приложений / проект GWT выдает неприятную небольшую кучку трассировки стека всякий раз, когда он пытается вернуться из моего метода входа в систему.Я использую GAE версии 1.5.0 и GWT версии 2.3.0.

Это приложение для Facebook, поэтому у меня есть следующее:

  • Плеер переходит к приложениюpage.
  • Они нажимают кнопку и перенаправляются на страницу аутентификации OAuth
  • Затем они перенаправляются обратно в приложение с токеном аутентификации в строке запроса
  • Я разбиваю строку запроса на части, чтобы получить UID, а затем использую его в качестве первичного ключа для моей сущности Player (RPC для бэкэнда ядра приложения)
  • Я извлекаю экземпляр сущности Player из хранилища данных и превращаю его вСериализуемый тип для возврата клиенту
  • Epic fail.

Когда я выкидываю исключение в JSAlert, я получаю большую неприятную кучу трассировки стека (я уже задумалсядостаточно для компиляции с использованием «pretty» вместо «obfuscated»).

Моя функция входа в систему выглядит следующим образом:

@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 Ответ

1 голос
/ 22 августа 2011

Проблема заключалась в использовании интерфейса IsSerializable, или, скорее, в моем плохом понимании.

При создании объекта IsSerialiazable требуется конструктор без аргументов. Я передавал нулевые значения из этого конструктора в главный конструктор, поэтому, когда к ним вызывались методы, возникали исключения нулевого указателя. Это было глупо с моей стороны, но эй, это был опыт обучения.

В моем конкретном случае все пошло примерно так ...

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());
}

Надеюсь, это кому-нибудь поможет.

...