Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 云端点生成代码中@JSONString注释的非法参数异常_Java_Python_Google Cloud Endpoints - Fatal编程技术网

Java 云端点生成代码中@JSONString注释的非法参数异常

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

我正在开发一个Google云端点web服务,在最终获得授权后,生成的代码出现了一些问题

我已经像这样构建了我的ProtoRPC消息,使用一个整数字段作为对象id、客户端id和高水位标记

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,这正是我需要的。我发现了另一篇解释为什么会发生这种情况的帖子,我只是不知道如何修复它。非常感谢!