Search code examples
javaandroidjsonrestloopj

Android Loopj's Async JsonObject reponse is cast to Objectid failed


I'm relatively new in Android & Restful API programming, so I might be making some stupid mistakes. However I am facing this from my response JsonObject:

Cast to ObjectId failed for value \"login\" at path \"_id\" for model \"User\"","name":"CastError","stringValue":"\"login\"","kind":"ObjectId","value":"login","path":"_id"}

I have tested my Rest API on Postman and everything returns just fine. The Restful API is written in Node.js and Express.

The Rest API is suppose to return a status, userid, and message to let the app know if the user logged in using the right username and password. The login works fine and it returns me a 200 which allows the app to login and keep it logged in using a session. However, I can't get anything from the response JsonObject to get the userid for my next step in displaying user information.

(Target Android API 23)

Code:

Restful.Java

public class RestClient {

    private static final String BASE_URL = "http://10.0.2.2:8000/api/";
    private static AsyncHttpClient client = new AsyncHttpClient();

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.get(getAbsoluteUrl(url), params, responseHandler);
    }

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }

    private static String getAbsoluteUrl(String relativeUrl){
        Log.d("URL: ", BASE_URL+relativeUrl);
        return BASE_URL + relativeUrl;
    }
}

LoginActivity.Java (Only the login part)

public void checkLoginDB(final RequestParams params, final String username){
        prgDialog.show();     

        RestClient.post("user/login", params, new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                Log.d("StatusCode: ", "Code "+ statusCode);
                try {
                    if (statusCode == 200) {
                        Toast.makeText(getApplicationContext(), "Logged In!", Toast.LENGTH_LONG).show();
                        session.createLoginSession(username);
                        Log.d("Log: ", "what " + response);
                        navigatetoHomeActivity();
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                Log.d("StatusCode: ", "Code "+ statusCode);
                prgDialog.hide();
                Toast.makeText(getApplicationContext(), "Failed!", Toast.LENGTH_LONG).show();
            }
        });
    }

Restful API's Server.js

  router.post('/user/login', function(req, res){
    var username = req.body.username;
    var password = req.body.password;
    if(username.length > 0 && password.length > 3){
      User.findOne({username: username, password: password}, function(err, user){
        if(err)
          res.json({statusCode: 0, message: "login error: " + err});
        if(!user)
          res.json({statusCode: 0, message: "Not Found"});

        res.json({statusCode: 200, userid: user._id, message: "Login Sucessful"});
      })
    } else {
      res.json({statusCode: 0, message: "Invalid Fields"});
    }
  });

  app.use('/api', router)

User.js (Defined schema)

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  username: String,
  password: String,
  firstname: String,
  lastname: String,
  agentID: Number,
  email: String,
  phone: Number
});

module.exports = mongoose.model('User', UserSchema);

Solution

  • Whenever you want to Login the user and want user details in return use post() method. in your code the second method is not post, so change client.get() to client.post()

    like this public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){ client.post(getAbsoluteUrl(url), params, responseHandler); }