2011-12-28 167 views
0

我有一個基於Spring MVC的應用程序服務器,它通過JSON與客戶端進行通信。 客戶端可以執行的查詢之一是「我有待處理的消息嗎?」 要做到這一點,客戶端創建一個認證對象並將其發佈到服務器。作爲回報,服務器發送一個待處理消息列表,for ex. List<PendingMessage>通知客戶端有關異常

現在,如果沒有掛起的消息,我返回null。但問題是,如何通知客戶端如果我有一個錯誤,例如,數據庫連接已經丟失,身份驗證是錯誤的,還是我願意與客戶端分享的任何其他異常?

回答

0

您可以捕獲代碼可能拋出的不同類型的異常。基於此,您可以定義自己的自定義消息&將其丟給客戶端。在客戶端,您只需在Exception上執行getMessage()。這應該可以解決問題。

0

你可以純粹拋出異常來做到這一點。 SpringMVC將異常映射到標準http狀態代碼(200s,400s,500s等)。就像您在Java中編寫代碼時一樣,您可以創建自定義例外以適應您的特定需求。

0

如果你正在設計客戶端和服務器,那麼你可能想要定義某種協議,這可能很有趣。您可以將您的Web服務器視爲一個rpc服務器,該服務器以給定請求的定義格式返回數據。

例如,使用HTTP狀態代碼,一個成功的響應可能會返回以下數據:

{ 
    status: 200, 
    message: "OK", 
    data: { 
     name: John Doe, 
     age: 31 
    }, 
    error: null 
} 

導致一個錯誤的請求:

{ 
    status: 400, 
    message: "Bad Request", 
    data: null, 
    error: "Database request timed out" 
} 

你會非常有嘗試捕獲塊捕獲任何預期的異常,然後可以將其轉換爲適當的JSON響應,概述客戶端可以處理的問題。

如果請求在到達servlet之前僅發生錯誤,則用於發出請求的API可能會公開某種類型的onError回調,然後可以使用該回調來通知客戶端錯誤。

+0

你已經有了一個很好的標題,但我的服務器接受從數據庫中檢索到的對象,並自動將它們轉換爲JSON格式(jersey + jackson),所以我不能真正做你所提供的... – stdcall 2011-12-28 19:42:15

+0

你應該只需將它包裝到自定義的json響應中,其中「data」屬性是從數據庫返回的json數據......它確實不應該是一個問題,特別是因爲有太多的json序列化API用於java – 2011-12-28 19:55:55

+0

我通常使用org.json,但從傑克遜JSON處理器庫的初步瀏覽,它真正顯示允許這樣簡單的事情 – 2011-12-28 19:59:23

0

從HTTP響應狀態碼開始。例如,如果您有數據庫連接問題,則返回500內部服務器錯誤。

此方法可能無法爲您的客戶提供他們所需的全部信息。因此,另外,您可以在響應正文中提供JSON的詳細信息。不管你想要結構這個JSON。如果您希望客戶端應用在收到您的回覆後轉到特定網址,請考慮在回覆中提供該網址。

最後一點:將200 OK與響應正文中的錯誤結合起來將會是一種糟糕的形式。我以前見過這個,而且很煩人。