2016-07-12 20 views
1

Ich entwickle eine Android App, die Google Endpoints als Backend verwendet. Aus irgendeinem Grund verursacht eine der Methoden der Endpunkte nur dann eine java.lang.NullPointerException, wenn sie vom Android-Client aufgerufen wird, aber nicht, wenn sie vom API-Explorer aufgerufen wird.Google Cloud Endpoints-Methode verursacht immer NullPointerException, warum?

Dies ist die Methode Endpunkte:

@ApiMethod(name = "getFriends", path = "friends", httpMethod = ApiMethod.HttpMethod.GET) 
public List<Profile> getFriends(@Named("userId") String userId) { 
    Profile profile = ofy().load().key(Key.create(Profile.class, userId)).now(); 
    List<String> friendIds = profile.getFriendIds(); // NullPointerException on this line 
    List<Profile> friends = new ArrayList<>(); 
    if (friendIds != null) { 
     for (String friendId : friendIds) { 
      Profile friend = ofy().load().key(Key.create(Profile.class, friendId)).now(); 
      friends.add(friend); 
     } 
    } 
    return friends; 
} 

Hier ist die Profil Einheit getFriendIds() Methode:

public List<String> getFriendIds() { 
    return friendIds != null ? ImmutableList.copyOf(friendIds) : null; 
} 

Im Debug-Modus und in der API-Explorer, funktioniert alles wie erwartet. In diesem Beispiel habe ich 2 Benutzer erstellt, einen mit id = 4567 und den anderen id = 9876. Hier ist, was passiert, wenn ich die Methode lief die Freunde zu bekommen:

enter image description here

Es funktioniert wie erwartet und verursacht keine Fehler, wenn sie von api Explorer aufgerufen.

ich es dann versucht, wenn der Benutzer keine Freunde:

enter image description here

Es funktioniert wie erwartet und keine Fehler verursacht, wenn sie von api Explorer aufgerufen.

In meinem Android-Client rufe ich diese genaue Methode, aber die Methode verursacht immer eine java.lang.NullPointerException.

Ich nenne es von einem Asynchron-Aufgabe wie folgt:

return mApi.getFriends(mUserId).execute().getItems(); 

Hier ist die stacktrace für die Client-Seite:

07-12 14:09:57.934 9777-9830/com.hb.birthpay W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 503 Service Unavailable 
07-12 14:09:57.934 9777-9830/com.hb.birthpay W/System.err: { 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err: "code": 503, 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err: "errors": [ 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  { 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  "domain": "global", 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  "message": "java.lang.NullPointerException", 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  "reason": "backendError" 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  } 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err: ], 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err: "message": "java.lang.NullPointerException" 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err: } 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056) 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
07-12 14:09:57.935 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
07-12 14:09:57.936 9777-9830/com.hb.birthpay W/System.err:  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
07-12 14:09:57.936 9777-9830/com.hb.birthpay W/System.err:  at com.hb.birthpay.utils.EndpointTask$GetFriends$override.doInBackground(EndpointTask.java:101) 
07-12 14:09:57.936 9777-9830/com.hb.birthpay W/System.err:  at com.hb.birthpay.utils.EndpointTask$GetFriends$override.access$dispatch(EndpointTask.java) 
07-12 14:09:57.936 9777-9830/com.hb.birthpay W/System.err:  at com.hb.birthpay.utils.EndpointTask$GetFriends.doInBackground(EndpointTask.java:0) 
07-12 14:09:57.936 9777-9830/com.hb.birthpay W/System.err:  at com.hb.birthpay.utils.EndpointTask$GetFriends.doInBackground(EndpointTask.java:68) 

Hier ist die stacktrace für das Backend:

java.lang.NullPointerException 
    at com.hb.backend.spi.BirthpayEndpoint.getFriends(BirthpayEndpoint.java:75) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 

W Ist das passiert und wie repariere ich es?

Antwort

0

Die NPE wird von der Linie der Fall zu sein: geholt von Ihrem Datenspeicher

List<String> friendIds = profile.getFriendIds(); 

Das bedeutet, dass profilenull ist, die von diesem Code passieren wird, wenn die Benutzer-ID nicht in einem Profile Objekt führt . Was ist mUserId eingestellt und ist es eine gültige ID auf dem Backend?

+0

Um meine Benutzer zu authentifizieren, verwende ich Firebase, die ein Token zurückgibt, das diesem Benutzer zugeordnet ist. Ich speichere dies in Google Datastore als die Profilobjekte ID. @Larry Schiefer –

+0

Überprüfen Sie jetzt, ob mUserId tatsächlich eine ID im Datenspeicher ist. @Larry Schiefer –

+0

Ja, du hast Recht, mUserId = [email protected], wenn du sie gespeichert hast, aber beim Aufruf der Methode "get friends" mUserId = [email protected] –