2

私は Google Cloud Endpoint Web サービスに取り組んでおり、最終的に認証が機能するようになった後、生成されたコードにいくつかの問題があります。

オブジェクト ID、client_id、および high_water_mark に整数フィールドを使用して、このように ProtoRPC メッセージを作成しました。

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

@JsonStringこれにより、フィールドの属性を含む Java ソースが生成されますlongが、サーバーからの応答を取得すると、次のエラーが発生します。

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でどのように機能するのでしょうか?

4

1 に答える 1

3

別の投稿で述べたように、これはprotorpcライブラリの癖が原因です。Google の API クライアント ライブラリは、フィールドが JSON の文字列であることを想定int64してuint64います。これは、Javascript 自体が (精度のために) までの整数しか処理できないため2**53です。

Google の "Discovery" 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)

ポストスクリプト:

その間、 Endpoints Proto Datastore APIを確認することをお勧めします。その使用に関するいくつかのスクリーンキャストを行いました。

で同じ問題を解決するにはendpoints-proto-datastore、インポートします

from protorpc import messages
from endpoints_proto_datastore.ndb import EndpointsVariantIntegerProperty

と使用

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

あなたの財産のために。

于 2013-03-12T01:44:08.793 に答える