IllegalArgumentException:期望的原始类,但得到:类UUID

时间:2015-06-14 23:03:32

标签: android google-app-engine google-cloud-endpoints

我的应用正在使用GAE端点。我的模型有UUID。一旦我尝试发送它的Android应用程序,它会遇到illegalArgument异常。

有人建议如何使用Google App Engine端点在Android应用上使用UUID处理端点模型?

 06-14 23:26:49.560  27462-27488/com.example E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.example, PID: 27462
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.IllegalArgumentException: key id
            at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:880)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:381)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
            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:460)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:30)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:15)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.IllegalArgumentException: key id, field private com.example.customApi.model.UUID com.example.customApi.model.Survey.id
            at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:880)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:471)
            at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:780)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:381)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
            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:460)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:30)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:15)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.IllegalArgumentException: **expected primitive class, but got: class com.example.customApi.model.UUID**
            at com.google.api.client.util.Data.parsePrimitiveValue(Data.java:444)
            at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:850)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:471)
            at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:780)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:381)
            at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
            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:460)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:30)
            at com.example.CustomAsyncTask.doInBackground(CustomAsyncTask.java:15)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

我的自定义类Endpoint正在返回Android:

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

import java.util.UUID;

@DatabaseTable
public class CustomClass {

    @DatabaseField(generatedId = true)
    UUID id;

    @DatabaseField
    String title;


    public CustomClass() {
        //nothing
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    }

我的终端代码:

import java.util.UUID;

import javax.inject.Named;

/**
 * An endpoint class we are exposing
 */
@Api(
        name = "customApi",
        version = "v1",
        resource = "customr",
        namespace = @ApiNamespace(
                ownerDomain = "xyz",
                ownerName = "xyz",
                packagePath = ""
        )
)
public class customClassEndpoint  {

    @ApiMethod(
            name = "insertCustom",
            scopes = "profile",
            clientIds = {"xx"},
            audiences = {"xx"}
    )
    public CustomClass insertcustomClass(CustomClass customClass, com.google.appengine.api.users.User authUser ) throws ConflictException, OAuthRequestException {
        logger.info("Calling insertcustomClass method");
        //persisting        customClass which assigns UUID
        return customClass;
    }

}

1 个答案:

答案 0 :(得分:0)

我确实理解为什么Google Api JSON解析器试图将UUID解析为原语,但至少我找到了解决此问题的方法。

在我的模型类中,我将字段保存为UUID,但更改了getter以返回String,现在它看起来像这样:

public String getId() {
      return id.toString(); 
}

它已经为我解决了这个问题。