-1

wenn ich versuche, in meinem System anmelden es ein User-Objekt aus Backend zurückzukehren, und es kehrt diese json mit http 200:Retrofit null Reaktion in einer Erfolgsanforderung 200

{ 
"data": [1] 
    0:{ 
    "id": 14 
    "name": "Adam" 
    "email": "[email protected]" 
    "password": "adam" 
    "avatar": "" 
    "activity": "" 
    "bio": "" 
    "member_since": "0000-00-00" 
    "remember_token": null 
    "created_at": "2016-05-17 17:10:42" 
    "updated_at": "2016-05-17 17:10:42" 
    }- 
    - 
} 

Alles ist scheinbar in Ordnung. Aber im Android Studio erhalte ich ein Null-Objekt, wenn ich Zugriff auf response.body bin()

Meine Methode in der Schnittstelle für die Anmeldung ist dies:

@GET("users/{name}/{password}") 
    Call<UserDTO> login(@Path("name") String name, @Path("password") String password); 

Und das ist der Teil I der erhalten Fehler:

Call<UserDTO> call = mRestApi.getService().login(email, password); 

     call.enqueue(new Callback<UserDTO>() { 
      @Override 
      public void onResponse(Call<UserDTO> call, Response<UserDTO> response) { 
       //call.cancel(); 
       if(response.code() == 401) //login incorrecto 
       { 
        onLoginFailed(); 

       }else if(response.code() == 200) { 
        //TODO usuario nulo al venir de una peticion rest 

        Log.d("DEBUG", response.body().getUser().getName()); 
        onLoginSuccess(); 
       } 
      } 

      @Override 
      public void onFailure(Call<UserDTO> call, Throwable t) { 
       call.cancel(); 
       Toast.makeText(getBaseContext(), "Error de conexión al servidor", Toast.LENGTH_LONG).show(); 
      } 
     }); 

In dieser Zeile es versagt:

Log.d("DEBUG", response.body().getUser().getName()); 

Fi schließlich Android Studio Fehler:

FATAL EXCEPTION: main 
Process: myapp.myapp, PID: 3349 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String myapp.flattomate.Model.User.getName()' on a null object reference 

Ich verwende jetzt DTO Muster, aber ohne das ich erhalten den gleichen Fehler.

Was passiert?

EDIT Retrofit-Klasse:

public class restAPI { 

    private static final String ENDPOINT = "http://192.168.2.102:8000/"; 
    private final FlattomateService mService; 

    public interface FlattomateService{ 
     @GET("users/{username}") 
     Call<User> getUser(@Path("username") Integer username); 

     @GET("users/index") 
     Call<List<UserDTO>> allUsers(); 

     @GET("group/{id}/users") 
     Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort); 

     @POST("users") 
     Call<User> register(@Body User user); 

     @GET("users/{name}/{password}") 
     Call<UserDTO> login(@Path("name") String name, @Path("password") String password); 


    } 

    public restAPI(){ 
     Gson gson = new GsonBuilder() 
       .serializeNulls() 
       .excludeFieldsWithoutExposeAnnotation() 
       .create(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(ENDPOINT) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 

     mService = retrofit.create(FlattomateService.class); 
    } 

    public FlattomateService getService(){ return mService; } 


} 

UserDTO.java:

public class UserDTO { 

    User user; 

    public User getUser() { return user; } 
} 

User.java:

public class User { 

    @SerializedName("id") 
    @Expose 
    private Integer id; 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("email") 
    @Expose 
    private String email; 
    @SerializedName("avatar") 
    @Expose 
    private String avatar; 
    @SerializedName("activity") 
    @Expose 
    private String activity; 
    @SerializedName("bio") 
    @Expose 
    private String bio; 
    @SerializedName("member_since") 
    @Expose 
    private String memberSince; 

    @SerializedName("password") 
    private String password; 

    public User(){} 

    public User(String name, String email, String password){ 
     this.name = name; 
     this.email = email; 
     this.password = password; 

    } 
    /** 
    * 
    * @return 
    * The id 
    */ 
    public Integer getId() { 
     return id; 
    } 

    /** 
    * 
    * @param id 
    * The id 
    */ 
    public void setId(Integer id) { 
     this.id = id; 
    } 

    /** 
    * 
    * @return 
    * The name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * 
    * @param name 
    * The name 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * 
    * @return 
    * The email 
    */ 
    public String getEmail() { 
     return email; 
    } 

    /** 
    * 
    * @param email 
    * The email 
    */ 
    public void setEmail(String email) { 
     this.email = email; 
    } 

    /** 
    * 
    * @return 
    * The avatar 
    */ 
    public String getAvatar() { 
     return avatar; 
    } 

    /** 
    * 
    * @param avatar 
    * The avatar 
    */ 
    public void setAvatar(String avatar) { 
     this.avatar = avatar; 
    } 

    /** 
    * 
    * @return 
    * The activity 
    */ 
    public String getActivity() { 
     return activity; 
    } 

    /** 
    * 
    * @param activity 
    * The activity 
    */ 
    public void setActivity(String activity) { 
     this.activity = activity; 
    } 

    /** 
    * 
    * @return 
    * The bio 
    */ 
    public String getBio() { 
     return bio; 
    } 

    /** 
    * 
    * @param bio 
    * The bio 
    */ 
    public void setBio(String bio) { 
     this.bio = bio; 
    } 

    /** 
    * 
    * @return 
    * The memberSince 
    */ 
    public String getMemberSince() { 
     return memberSince; 
    } 

    /** 
    * 
    * @param memberSince 
    * The member_since 
    */ 
    public void setMemberSince(String memberSince) { 
     this.memberSince = memberSince; 
    } 


} 
+0

So onReponse() wird aufgerufen, aber diese Aussage ist null. Haben Sie versucht, auf andere Felder zuzugreifen, um zu sehen, ob sie auch null zurückgeben? –

+0

Wenn Objekt null ist, gibt der Zugriff auf Methoden null zurück –

+0

Ich denke über geparste Daten von json sind falsch, weil diese Ausgabe: D/Call-Anforderung: Request {Methode = GET, URL = http: //192.168. 2.102: 8000/users/[email protected]/pass, tag = null} D/Antworttext: {} –

Antwort

0

Das Problem war die json Laravel senden:

$response = Response::make(json_encode(['data'=>$user]), 200)->header('Location', $BASE_URL.$user->id)->header('Content-Type', 'application/json'); 
    return $response; 

Laravel schickte ein Array, das Retrofit nicht zu behandeln wusste.

Die Lösung wurde nur die $ Benutzer wie folgt senden:

$response = Response::make(json_encode($user), 200)->header('Content-Type', 'application/json'); 
Verwandte Themen