我正在尝试将包含密钥的对象发送到Google App Engine端点。但是对象不能反序列化。这是我得到的错误:

java.io.IOException:     com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:
(was java.lang.NullPointerException)
(through reference chain:
Form["identity"]->FormsIdentity["user"]->User["key"]->com.google.appengine.api.datastore.Key["appId"])


这是我发送的对象:

    "identity":{
    "user":
    {
       "key" : {
              "kind" : "User",
              "appId" : "no_app_id",
              "id" : "1",
              "complete" : true,
              "namespace" : ""
            },
      "googleID" : "8493582",
      "emailAddress" : "[email protected]",
      "credential" : "[email protected]"
    },
    "deviceID":"4234o34i523534"
}


但是我只得到前端的错误,因为端点内的代码已执行。

最佳答案

当密钥序列化为json时,它将尝试从Key.class调用getAppId()

  public String getAppId() {
    return appIdNamespace.getAppId();
  }


如您所见,此getter尝试访问appIdnamespace,在您的情况下,该名称可能为null。无法明确设置appIdnamespace,但是在使用KeyFactory创建键时或在数据存储区持久存储对象之后会生成该appIdnamespace。

由于您没有发布用于返回此标识对象的方法的代码,因此我不确定您的用户键为何未设置appIdnamespace,但是我的猜测是您不会返回已持久化的对象或未正确创建密钥。

07-24 09:36