Search code examples
javaandroidgoogle-api-java-clientgoogle-cloud-endpoints-v2

Google Cloud Endpoints error Caused by: java.lang.IllegalArgumentException: expected primitive class, but got


I have a simple Google Cloud Endpoint that is called from my Android app. It has been working like a charm for quite a long time. Recently, I have updated Android Studio, Gradle plugin, and the build.gradle files in the project.

Since then, the Android app is returning this error every time it tries to call to that endpoint:

    Process: com.berylo.chat, PID: 26426
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.IllegalArgumentException: 
        at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:889)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:382)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:355)
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
        at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
        at com.berylo.chat.Encriptador$3.doInBackground(Encriptador.java:282)
        at com.berylo.chat.Encriptador$3.doInBackground(Encriptador.java:277)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.lang.IllegalArgumentException: expected primitive class, but got: class com.crypto.berylo.com.clavePublica4Api.model.RespuestaAlCliente
        at com.google.api.client.util.Data.parsePrimitiveValue(Data.java:453)
        at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:859)
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:382) 
        at com.google.api.client.json.JsonParser.parse(JsonParser.java:355) 
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87) 
        at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81) 
        at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459) 
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
        at com.berylo.chat.Encriptador$3.doInBackground(Encriptador.java:282) 
        at com.berylo.chat.Encriptador$3.doInBackground(Encriptador.java:277) 
        at android.os.AsyncTask$2.call(AsyncTask.java:333) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764)

This is the Endpoint code:

@ApiMethod(name = "obtenerDiasCaducidadClavesDeGrupo",
            path = "grupo",
            httpMethod = ApiMethod.HttpMethod.GET)
    public RespuestaAlCliente obtenerDiasCaducidadClavesDeGrupo(User user)
            throws OAuthRequestException, IOException {
        String dias = "";
        if (user == null)
        {
            throw new OAuthRequestException("Usuario no valido");
        }
        else {
            dias = DIAS_HASTA_CADUCIDAD_DE_CLAVES_DE_GRUPO;
        }
        respuestaalcliente.setMessage(dias);
        logger.info("respuestaalcliente: " + respuestaalcliente);
        return respuestaalcliente;
    }

And this is the Android app code. The line which triggers de error is marked with THIS ------>

private void obtenernumeroDiasValidezClavesAsimetricas(final Context context){
        try {
            AsyncTask<Void, Void, String> miTareaAsincrona;
            miTareaAsincrona = new AsyncTask<Void, Void, String>() {

                @Override
                protected String doInBackground(Void... params) {
                    try {
THIS ------>            RespuestaAlCliente respuestaAlCliente = MisEndPointsClavePublica.serviceEndPoint.obtenerDiasCaducidadClaveAsimetrica().execute();
                        return respuestaAlCliente.getMessage();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return null;
                    }
                }

                @Override
                protected void onPostExecute(String result) {
                    if((result != null) && (!result.equals("") && (!result.equals("null")))) {
                        numeroDiasValidezClaveAsimetrica = parseInt(result);
                    } else {
                        numeroDiasValidezClaveAsimetrica = 1;
                    }
                    try {
                        generateAsymmetricKeys(context, numeroDiasValidezClaveAsimetrica);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            };
            miTareaAsincrona.execute(null, null, null);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

RespuestaAlCliente is a simple class that wraps the endpoint's response, as primitives are not allowed as endpoints responses

public class RespuestaAlCliente {

    public String message;

    public RespuestaAlCliente() {}

    public RespuestaAlCliente(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

I have tried reverting to the previous Android Studio version, gradle plugin, libraries, and even restoring some project's backups. The error persists.

I am missing something, any ideas? Thanks in advance.

Edit: I forgot to mention that I found this old issue in google-api-java-client's github, with the same stacktrace. It could be related to my problem. https://github.com/googleapis/google-api-java-client/issues/1250


Solution

  • Well, shame on me, this was my fault :(

    I wanted some people to see my website before publishing it, so I uploaded it with some security constraints in my web.xml file, and gave permissions to those users. Those restrictions prevented the Android app to reach the backend endpoints...

    I hope nobody wasted time on this. I am sorry for any inconvenience it may have caused.