java - Cloud Endpoints 生成的代码中 @JSONString 注释的非法参数异常

标签 java python google-cloud-endpoints

我正在开发 Google Cloud Endpoint Web 服务,在最终获得身份验证后,我在生成的代码方面遇到了一些问题。

我已经像这样构建了我的 ProtoRPC 消息,使用对象 id、client_id 和 high_water_mark 的整数字段。

class NoteMessage(messages.Message):
    id = messages.IntegerField(1)
    client_id = messages.IntegerField(2)
    high_water_mark = messages.IntegerField(5)
    ...

这会生成在 long 字段上包含 @JsonString 属性的 Java 源代码,但是当我从服务器收到响应时,出现以下错误。

E/AndroidRuntime( 9231): java.lang.IllegalArgumentException: number type formatted as a JSON number cannot use @JsonString annotation [key id, field private java.lang.Long com.google.api.services.notes.model.NoteApiMessagesNoteMessage.id]
E/AndroidRuntime( 9231):    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:119)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:599)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parse(JsonParser.java:350)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:586)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parseArray(JsonParser.java:456)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:549)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parse(JsonParser.java:350)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:586)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonParser.parse(JsonParser.java:289)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:76)
E/AndroidRuntime( 9231):    at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:71)
E/AndroidRuntime( 9231):    at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:495)
E/AndroidRuntime( 9231):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:465)
E/AndroidRuntime( 9231):    at com.ryanharter.hashnote.sync.SyncAdapter.syncNotes(SyncAdapter.java:187)
E/AndroidRuntime( 9231):    at com.ryanharter.hashnote.sync.SyncAdapter.onPerformSync(SyncAdapter.java:110)
E/AndroidRuntime( 9231):    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:254)

我似乎找不到任何可以实际控制序列化或反序列化的地方,那么这应该如何与 Java 一起使用呢?

最佳答案

正如 another post 中提到的,这是由 protorpc 库的一个怪癖引起的。 Google 的 API 客户端库期望 int64uint64 字段为 JSON 中的字符串,因为 Javascript 本身只能处理(由于精度)最大 2**53< 的整数.

正如您在 Google 的“Discovery”API 标准的 type-format documentation 中所看到的,这就是这些类型的预期结果。但是,protorpc 库没有 currently use 相同的语义,我们仍在确定正确的处理方法。

所以,当你使用

id = messages.IntegerField(1)

您正在使用 IntegerField 的默认变体,即 messages.Variant.INT64。这反过来又使 Java 客户端库需要一个 JSON 字符串,例如

{'id': '123456789'}

相反,从 protorpc 返回的响应是

{'id': 123456789}

作为应用程序的临时解决方法,可以使用

id = messages.IntegerField(1, variant=messages.Variant.INT32)

或者如果您的 ID 大小需要超过 32 位,请使用:

id = messages.StringField(1)

后脚本:

当您使用它时,我建议您查看 Endpoints Proto Datastore API 。我们已经对其使用做了一些screencasts

要解决与 endpoints-proto-datastore 相同的问题,您需要导入

from protorpc import messages
from endpoints_proto_datastore.ndb import EndpointsVariantIntegerProperty

并使用

attr1 = EndpointsVariantIntegerProperty(variant=messages.Variant.INT32)

为您的属性(property)。

关于java - Cloud Endpoints 生成的代码中 @JSONString 注释的非法参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349909/

相关文章:

python - 为在 Django 之上编写的谷歌云端点 API 编写测试用例

java - IntelliJ IDEA 无法打开 *.cfg 文件

java - 如何在play框架2.1中显示图像

python - 重新绑定(bind)引发异常的字符串对象意味着什么?

google-cloud-functions - 带有 Google Cloud Functions 上游请求超时的 ESPv2

google-app-engine - 提供来自 Google Cloud Storage 的静态 SPA 和来自 Google App Engine 的 API

java - 在fuse Fabric中部署camel项目

java - 为什么 JTables 没有显示添加内容?

python - Django - 在 View 中返回多个查询集

python - 将组折叠为一行 Pandas 数据框