2013-03-02 2 views
5

У меня есть конечная точка формируются следующим образом:Повторные ошибок с Google Cloud Endpoints

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      throw new EntityExistsException("Object already exists"); 
     } 
     mgr.makePersistent(book); 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 

Интересно, как я должен возвращать ошибки клиента. . книга содержит некоторые обязательные поля, проверку ISNM и т. д.

Так что я бы предположил, что выбрал исключение, но как эта карта соответствует возвращенному ответу json. Реакция json должна содержать все полевые ошибки, чтобы выделить эти поля в клиенте.

+0

Вам удалось решить эту проблему? Если бы вы это сделали? – dynamokaj

+0

Нет, но мне больше не интересно –

ответ

5

В целом исключения откликаются на код состояния http 500 в ответе. Со следующими исключениями вы можете получить различные коды: com.google.api.server.spi.response.BadRequestException -> 400 com.google.api.server.spi.response.UnauthorizedException -> 401 com.google.api.server.spi.response.ForbiddenException -> 403 com.google.api.server.spi.response.NotFoundException -> 404

Если вы потребляете конечной точке в Android код ошибки будет в IOException брошен там и вы можете реагировать соответственно в уловке.

+0

Да Я понимаю, что возвращаю коды ошибок HTTP. Я задаюсь вопросом, как обращаться с подробными сообщениями об ошибках, такими как нарушенные ограничения свойств домена. –

+0

Это не то поведение, которое я вижу в 1.7.5. Я бросаю BadRequestException и клиент получает 200 с моим сообщением String в теле как немного JSON. – Eliot

+0

Позвольте мне утверждать, что: это не работает на сервере locahost dev, но оно * работает * на сервере App Engine, даже в 1.7.5. Так что это ошибка на сервере localhost dev. – Eliot

0

Im делает это, имея абстрактный класс Entity.

У этого есть Обратный Код, который является перечислением и Строкой ErrorMessage.

Таким образом, «Книга» может унаследовать от Entity. А ваш ответ может выглядеть так:

public Book insertBook(Book book) { 
    PersistenceManager mgr = getPersistenceManager(); 
    try { 
     if (containsShout(book)) { 
      book.setResponseCode(ResponseCode.ERROR); 
      book.setError("Object already exists"); 
     } else { 
      mgr.makePersistent(book); 
     } 
    } finally { 
     mgr.close(); 
    } 
    return book; 
} 
+0

Спасибо за ответ @davibq, но это загрязняет классы объектов imo. Возможно, я должен создать SingleEntitiyResponse, содержащий модель, статус ответа и ошибки.Обратите внимание, что я могу сделать то же самое для com.google.api.server.spi.response.CollectionResponse, расширив его и включив аналогичный статус и ошибки ответа. –

3

Я пробовал что-то вроде этого и, казалось, работал хорошо для меня.

class Response<T> { 
    Status status; 
    String userFriendlyMessage; 
    T object; //your bean or entity object 

    RestResponse toRestResponse() { 
     RestResponse r = new RestResponse(); 
     r.status = status; 
     r.userFriendlyMessage = userFriendlyMessage; 
     r.object = object; 
    } 
} 

Вы не можете вернуть общий объект из конечной точки. Поэтому создайте эквивалентный класс RestResponse, который можно создать из Response.

class RestResponse { 
    Status status; 
    String userFriendlyMessage; 
    Object object; 
} 

Статус может быть таким.

public enum Status { 
    SUCCESS, RESOURCE_NOT_FOUND, RESOURCE_ALREADY_EXISTS; //etc 
} 

Все ваши оконечных методы будут возвращать RestResponse, которые, в свою очередь, построенную из реагирования (T может быть ваш боб или объект сущности).

Когда вы десериализуете свой ответ json (RestResponse), вы можете сразу же десериализовать его как Response.

Надеюсь, это поможет.

С уважением, Sathya

+0

Это не работает для меня, я получаю: «Ошибка: тип объекта T не поддерживается». Пример: public Response.RestResponse getBeer() { Response genericResponse = new Response (); \t genericResponse.status = Status.SUCCESS; genericResponse.object = новое пиво («Carlsberg»); return genericResponse.toRestResponse(); } – dynamokaj

+0

@dynamokaj - можете ли вы опубликовать некоторые фрагменты кода? Вы можете подключиться к github или другому документу. – Sathya

+0

Да вот он: https://gist.github.com/dynamokaj/cb0c0569311d9d15ee40 он должен быть как ваш. Однако я сделал приватные поля и поместил их в один файл (ResponseDto.java) вместо трех файлов. – dynamokaj

Смежные вопросы