Java 云端点生成代码中@JSONString注释的非法参数异常
我正在开发一个Google云端点web服务,在最终获得授权后,生成的代码出现了一些问题 我已经像这样构建了我的ProtoRPC消息,使用一个整数字段作为对象id、客户端id和高水位标记Java 云端点生成代码中@JSONString注释的非法参数异常,java,python,google-cloud-endpoints,Java,Python,Google Cloud Endpoints,我正在开发一个Google云端点web服务,在最终获得授权后,生成的代码出现了一些问题 我已经像这样构建了我的ProtoRPC消息,使用一个整数字段作为对象id、客户端id和高水位标记 class NoteMessage(messages.Message): id = messages.IntegerField(1) client_id = messages.IntegerField(2) high_water_mark = messages.IntegerField(5
class NoteMessage(messages.Message):
id = messages.IntegerField(1)
client_id = messages.IntegerField(2)
high_water_mark = messages.IntegerField(5)
...
这将生成Java源代码,其中包含long
字段上的@JsonString
属性,但是当我从服务器获得响应时,我会得到以下错误
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中应该如何工作呢?如中所述,这是由于protorpc
库的一个怪癖造成的。谷歌的API客户端库希望int64
和uint64
字段是JSON中的字符串,因为Javascript本身只能处理(由于精度)高达2**53的整数
正如您在Google的“发现”API标准中所看到的,这就是这些类型的预期。然而,protorpc
库并不具有相同的语义,我们仍在确定正确的处理方法
所以,当你使用
id = messages.IntegerField(1)
您正在使用IntegerField
s的默认变量,即messages.variant.INT64
。这反过来又使Java客户机库需要一个JSON字符串,如
{'id': '123456789'}
相反,从protorpc
返回的响应是
{'id': 123456789}
作为应用程序的临时解决方案,请使用
id = messages.IntegerField(1, variant=messages.Variant.INT32)
或者,如果您的ID大小需要超过32位,请使用:
id = messages.StringField(1)
后记:
当你做这件事的时候,我建议你看看。我们已经做了一些关于它的使用
要解决端点原始数据存储的相同问题,您需要导入
from protorpc import messages
from endpoints_proto_datastore.ndb import EndpointsVariantIntegerProperty
和使用
attr1 = EndpointsVariantIntegerProperty(variant=messages.Variant.INT32)
谢谢你的财产。非常感谢@bossylobster,这正是我需要的。我发现了另一篇解释为什么会发生这种情况的帖子,我只是不知道如何修复它。非常感谢!