2013-03-02 106 views
5

我產生一個端點:與谷歌雲端點返回錯誤

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 repsonse應包含所有字段錯誤以突出顯示客戶端中的這些字段。

+0

你管理來解決這個問題?如果你是如何做到的? – dynamokaj 2015-01-16 23:55:16

+0

不,但我不再感興趣 – 2015-01-17 06:38:45

回答

5

通常情況下,異常映射到響應中的500個http狀態碼。但下列情況除外,你可以得到不同的代碼: 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錯誤代碼。我想知道的是如何處理詳細的錯誤消息,如違反域屬性的約束。 – 2013-03-03 09:03:54

+0

這不是我在1.7.5中看到的行爲。我拋出了一個BadRequestException,客戶端在我的消息字符串中獲得了一個200字符串作爲JSON。 – Eliot 2013-04-03 15:15:03

+0

讓我限定:這不適用於locahost開發服務器,但它似乎可以在App Engine服務器上工作,即使在1.7.5版本中也是如此。所以這真的是localhost dev服務器中的一個錯誤。 – Eliot 2013-04-03 15:34:41

0

我通過抽象類實體做這件事。

它有一個ResponseCode,它是一個枚舉和一個String ErrorMessage。

所以「書」可以從實體繼承。你的迴應可能是這樣的:

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來執行相同的repsonse狀態和錯誤。 – 2013-03-05 07:39:24

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; 
    } 
} 

您不能從端點返回通用對象。因此,創建一個可以從Response創建的等效RestResponse類。

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

狀態可以是這樣的。

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

您所有的端點方法將返回這將反過來從響應構建RestResponse(T可以是你的bean或實體對象)。

當您反序列化您的json響應(RestResponse)時,您可以直接將其反序列化爲Response。

希望這會有所幫助。

問候, 沙迪亞

+0

這不適用於我,我得到:「錯誤:對象類型T不支持。」示例:public Response.RestResponse getBeer(){ 響應 genericResponse = new Response (); \t genericResponse.status = Status.SUCCESS; genericResponse.object = new Beer(「Carlsberg」); return genericResponse.toRestResponse(); } – dynamokaj 2015-01-16 23:49:54

+0

@dynamokaj - 你可以請張貼一些代碼片段?你可以鏈接到github或其他文檔。 – Sathya 2015-01-16 23:58:53

+0

是的,這裏是:https://gist.github.com/dynamokaj/cb0c0569311d9d15ee40它應該和你的一樣。不過,我已將這些字段設置爲私有,並將其放到一個文件(ResponseDto.java)中,而不是三個文件。 – dynamokaj 2015-01-17 00:04:09