Search code examples
androidrobospice

RoboSpice JSON request to server


I use the sample about GoogleHttpClientSpiceRequest but I need send request on JSON format. So, I changed my code but I got error:

07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662): 15:39:08.744
Thread-11643 An exception occurred during request network execution :null 
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662): java.lang.NullPointerException 07-11 15:39:08.738:
E//DefaultRequestRunner.java:138(5662):     at com.octo.android.robospice.sample.googlehttpclient.SampleSpiceRequest.loadDataFromNetwork(SampleSpiceRequest.java:43)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at com.octo.android.robospice.sample.googlehttpclient.SampleSpiceRequest.loadDataFromNetwork(SampleSpiceRequest.java:1)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:45)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:134)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:201)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at java.util.concurrent.FutureTask.run(FutureTask.java:234) 07-11
15:39:08.738: E//DefaultRequestRunner.java:138(5662):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-11 15:39:08.738: E//DefaultRequestRunner.java:138(5662):     at java.lang.Thread.run(Thread.java:864)

My code: package com.octo.android.robospice.sample.googlehttpclient;

import java.io.IOException;

import org.json.JSONException;
import org.json.JSONObject;

import roboguice.util.temp.Ln;

import android.util.Log;

import com.google.api.client.http.ByteArrayContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.json.jackson.JacksonFactory;
import com.octo.android.robospice.request.googlehttpclient.GoogleHttpClientSpiceRequest;
import com.octo.android.robospice.sample.googlehttpclient.model.json.WeatherResult;

public class SampleSpiceRequest extends GoogleHttpClientSpiceRequest< WeatherResult > {

    private String baseUrl;
    private JSONObject jsonObject;

    public SampleSpiceRequest( String zipCode ) {
        super( WeatherResult.class );
        this.baseUrl = "my domain";

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.accumulate("action", "login");
            jsonObject.accumulate("username", "root");
            jsonObject.accumulate("password", "pass");
        } catch (JSONException e) {
            e.printStackTrace();
        }        
    }

    @Override
    public WeatherResult loadDataFromNetwork() throws IOException {        
            HttpRequest request = getHttpRequestFactory().buildPostRequest(
                    new GenericUrl(baseUrl), 
                    ByteArrayContent.fromString("application/json", jsonObject.toString())
                );
            request.setParser(new JacksonFactory().createJsonObjectParser());
            Log.i("DEBUG", request.execute().parseAsString());


            return request.execute().parseAs(getResultType());
    }

}

Solution

  • You local variable JSONObject jsonObject is hiding your instance member JSONObject jsonObject.

    Change your constructor to initialize the instance member :

    public SampleSpiceRequest( String zipCode ) {
        // ...
        jsonObject = new JSONObject();
        // ...
    }
    

    This is called Variable Shadowing