2013-03-11 2 views
2

Google Cloud Endpoint 웹 서비스에서 일하고 있으며 최종적으로 인증이 작동 한 후에 생성 된 코드에 몇 가지 문제가 있습니다.Cloud Endpoints에서 @JSONString 주석에 잘못된 인수 예외가 발생했습니다.

개체 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) 
    ... 

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) 

실제로 직렬화 또는 직렬화를 제어 할 수 있습니다, 그래서 어떻게 자바와 함께 작동하도록되어 어디있는 장소를 찾을 수없는 것?

답변

3

another post에서 언급했듯이 이것은 protorpc 라이브러리의 기이함으로 인해 발생합니다. Google의 API 클라이언트 라이브러리는 int64uint64 필드가 JSON의 문자열이라고 기대합니다. 자바 스크립트 자체는 2**53까지의 정수 만 처리 할 수 ​​있기 때문입니다.

Google의 'Discovery'API 표준에 대해 type-format documentation에서 알 수 있듯이 이러한 유형에 대해 기대할 수 있습니다. 그러나 protorpc 라이브러리는 동일한 의미 체계가 아니라 currently use이며, 우리는 여전히 올바른 진행 방법을 결정하고 있습니다. 그래서

, 당신은 당신이 messages.Variant.INT64입니다 IntegerField들에 대한 기본 변형을 사용하는

id = messages.IntegerField(1) 

를 사용합니다. 이것은 차례로 자바 클라이언트 라이브러리는 응용 프로그램에 대한 임시 주위 작업으로 JSON의

{'id': '123456789'} 

같은

는 응답이 protorpc에서 반환하는 대신 문자열입니다

{'id': 123456789} 

을 기대 하나

를 사용한다 귀하의 ID의 크기가 32 비트를 초과해야하는 경우
id = messages.IntegerField(1, variant=messages.Variant.INT32) 

또는 는 사용

id = messages.StringField(1) 

POST-SCRIPT : 당신이 그것에 인 동안, 나는 Endpoints Proto Datastore API 보는 것이 좋습니다

. 우리는 그것의 사용에 약간 screencasts을했습니다.

from protorpc import messages 
from endpoints_proto_datastore.ndb import EndpointsVariantIntegerProperty 

를 가져오고 속성에 대한

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

를 사용하는 것, endpoints-proto-datastore와 같은 문제를 해결합니다.

+1

감사합니다. @bossylobster를 많이 보내 주셔서 감사합니다. 나는 그것이 일어난 이유를 설명하는 다른 게시물을 발견했다. 나는 그것을 고치는 방법을 알지 못했다. 매우 감사! – rharter

+0

우수 답변 –

관련 문제