2012-11-13 28 views
24

在所有的可能性,以響應返回給客戶端在REST服務,我已經看到了兩種可能性,看起來相當的:一個WebApplicationException(可能使用Response實例),或者返回Response實例拋出。WebApplicationException VS響應

爲什麼在結果相同的情況下使用一種可能性?這是否與REST框架相關,該框架可能被配置爲在異常和常規響應之間做出不同反應?

+1

我將'WebApplicationException'看作失敗情況而不是成功案例。如果你有一個通常在成功案例中返回(說)一個JAXB對象的方法,那麼拋出一個'WebApplicationException'就提供了一種在失敗情況下返回其他類型數據的方法。但是如果方法被聲明在成功情況下返回'Response',那麼對異常方法的需求就會減少。 –

+1

查看[Jersey文檔](http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e435)瞭解'Response'與'WebApplicationException'的一些想法。爲獲得成功,請始終使用「響應」。 – 2012-11-13 14:40:20

+0

@IanRoberts我明白一個人通常用於失敗,另一個用於成功場景。但是,我的問題更具有技術性,即如果框架是異常還是常規響應,框架是如何解釋或處理響應,那麼是否存在差異? (我添加了Jersey標籤)。 –

回答

22

爲什麼在結果相同的情況下使用一種可能性?

也許是因爲作爲(Java)程序員,您習慣於在應用程序的特定規則被破壞時拋出異常?將一些字符串轉換爲數字,你可能會得到一個NumberFormatException,在一個數組中使用一個錯誤的索引,並且你得到一個ArrayIndexOutOfBoundsException,訪問你不允許的東西,並得到一個SecurityException等等。你習慣於在「常規響應「無法創建(不是來自錯誤的輸入或某些處理錯誤)。

當您無法返回常規響應時,您必須向客戶端返回錯誤響應。您可以通過拋出異常或手動構建響應來做到這一點。這對你的客戶端來說是一樣的,但對你的服務器端代碼來說並不是一回事。

拋出異常讓你的代碼更清晰,更容易推理,從而更容易理解。我們的想法是對WebApplicationException進行子分類並創建您自己的有意義的例外(例如ProductNotFoundException extends WebApplicationException { ... },AccessDeniedException extends WebApplicationException { ... }或重複使用例外與exception mapper)。

它當時吸塵器throw new ProductNotFoundException()throw new AccessDeniedException(),讓框架處理它,而不是每次都建立Response,後來跟隨用於構建它搞清楚正在發生的事情的代碼部分的細節。

+8

還有另一個引發異常的原因:如果您使用的是事務,它允許容器回滾您之前在該請求中對數據所做的任何更改。如果你只是定期回覆,你需要自己照顧。 –

+0

你是什麼意思「讓框架處理它」?你有什麼文章可以參考它的工作原理嗎?謝謝。 – Cacheing

+0

@緩存:[JAX-RS規格](http://download.oracle.com/otndocs/jcp/jaxrs-1。1-mrel-eval-oth-JSpec /)提到應該如何處理WebApplicationException。您甚至可以註冊一個異常映射提供程序,這在規範中也有描述。 – Bogdan

相關問題