2015-11-19 166 views
21

一些過載的呼叫請求的方法,如:get()post(Entity<?> entity)(有其他人)的SyncInvoker返回一個Response對象,而不是解組的內容。JAX-RS的客戶端:ResponseProcessingException處理

我注意到,在get()的情況下,沒有記錄ResponseProcessingException,而其它方法,例如全部3種重載post方法,可以拋出ResponseProcessingException

我知道,ResponseProcessingExceptionRuntimeExceptionProcessingException繼承,但我還是會解釋這意味着get()方法不會拋出一個ResponseProcessingException

這是正確的嗎?那麼ClientResponseFilter?爲什麼行爲與其他呼叫請求方法(put,post,..)的行爲不同?

此外,的Javadoc其做扔的方法的ResponseProcessingException說:

一個接收到的HTTP響應的情況下

處理失敗(例如,在過濾器 響應實體數據轉換爲一個或期間特定Java類型的實例)。

的部分:

或響應實體數據轉換成一個 特定Java類型

的一個實例過程中似乎是錯在這裏,作爲readEntity方法不應該但已被稱爲:

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9915

這是複製&粘貼文檔錯誤?

我想過濾器將是一個有效的情況,但。

+0

@BalcusC這是一個Java問題,JAX-RS是Java EE的一部分,JAX-RS客戶端是JAVA EE 7的一部分。請參閱Javadoc的鏈接。請不要刪除這些標籤。 – Puce

回答

1

該文檔當然不一致。很顯然,當ClientResponseFilter失敗時,ResponseProcessingException將被拋出。

我看(3.0.16的RESTEasy)的執行做到這一點:

try { 
    filter.filter(requestContext, responseContext); 
} catch (ResponseProcessingException e) { 
    throw e; 
} catch (Throwable e) { 
    throw new ResponseProcessingException(response, e); 
} 

沒有理由,當putpost方法做get方法不會宣佈例外。它們在內部都由相同的代碼處理。

我的結論是,方法之間的文檔略有差異只是一個疏忽。

有趣的是,在我的源代碼的拷貝,則get()方法具有這條線在其的Javadoc:

/** 
* @throws javax.ws.rs.ProcessingException 
*   in case the invocation processing has failed. 

雖然所有其他類似的方法(例如get(Class<T>))都記錄這樣的:

/** 
* @throws ProcessingException   in case the request processing or subsequent I/O operation fails. 

引人注目的是第一個完全合格的類名。只是一個預感,但這讓我覺得它是在不同的時間或由不同的人投入。也許我在過度勞累。我試圖查看修訂歷史記錄,但是我發現所有內容都是一次提交,說「將源代碼移到自己的存儲庫」)。那麼多。

但是,正如你指出的那樣,這不是一個錯誤,因爲ResponseProcessingExceptionProcessingException的子類,並且甚至不是檢查的異常。

0

如果你不想讓你的異常包裝在ResponseProcessingException中,你可以讓你的異常擴展它,那麼它將不包裝。當然,只有當你使用自己的異常時,這是可行的,並且你可以使用RuntimeException。