Poe Poe
Poe Poe

Reputation: 76

Realm Object is empty when posting with Retrofit

I try to pass realm object to retrofit put method. Although there is no threading error unlike other, somehow retrofit is passing empty object without data from realm object. User extends Realm Object.

This is retrofit method:

    @Headers("Content-Type: application/json") @PUT(USER + "/{id}") Observable<Profile> editUser(@Body User user, @Path("id") String id);

This is how I call in activity:

if (!name.getText().toString().isEmpty()
    && !email.getText().toString().isEmpty()
    && !phone.getText().toString().isEmpty()) {
  realm.beginTransaction();
  agent.setName(name.getText().toString());
  agent.setPhone(phone.getText().toString());
  agent.setEmail(email.getText().toString());
  realm.commitTransaction();

  ConsumerRestAdapter.getService(this)
      .editUser(agent, agent.getId())
      .subscribeOn(Schedulers.newThread())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(new Observer<Profile>() {
        @Override public void onCompleted() {
          fillValues();
        }

        @Override public void onError(Throwable e) {
          Timber.tag("Profile Editing onError").e(e.getLocalizedMessage());
        }

        @Override public void onNext(Profile profile) {
          realm.beginTransaction();
          realm.where(User.class).findAll().clear();
          realm.copyToRealm(profile.getUser());
          agent = profile.getUser();
          realm.commitTransaction();
        }
      });
}

But when I checked the retrofit log, the object passed to server is empty object.

    {"created_at":0,"has_password":false,"is_admin":false,"updated_at":0}

Upvotes: 1

Views: 503

Answers (1)

Poe Poe
Poe Poe

Reputation: 76

Oh..I forgot I am intercepting with GSON header. So here is my answer.

public RestAdapter normalRestAdapter() {

//let gson ignore realm object
Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
  @Override public boolean shouldSkipField(FieldAttributes f) {
    return f.getDeclaringClass().equals(RealmObject.class);
  }

  @Override public boolean shouldSkipClass(Class<?> clazz) {
    return false;
  }
}).create();

//okhttp to read cookie from server
okHttpClient.setCookieHandler(
    new CookieManager(persistentCookieStore, CookiePolicy.ACCEPT_ALL));

RestAdapter restAdapter;

if (BuildConfig.DEBUG) {
  restAdapter = new retrofit.RestAdapter.Builder().setEndpoint(BASE_URL)
      .setConverter(new GsonConverter(gson))
      .setLogLevel(RestAdapter.LogLevel.FULL)
      .setClient(new OkClient(okHttpClient))
      .setRequestInterceptor(new NNRequestInterceptor())
      .setErrorHandler(new RetrofitErrorHandler(mContext))
      .build();
} else {
  restAdapter = new retrofit.RestAdapter.Builder().setEndpoint(BASE_URL)
      .setConverter(new GsonConverter(gson))
      .setClient(new OkClient(okHttpClient))
      .setErrorHandler(new RetrofitErrorHandler(mContext))
      .build();
}

return restAdapter;

}

The solution is I created new User object and pass it to retrofit.

User user = new User();

and it works now.

Upvotes: 1

Related Questions