2012-11-26 48 views
61

任何人都可以向我解釋JAX-RS提供者是什麼以及@Provider註釋是幹什麼的。我一直在閱讀文檔,但我不能得到它。
如果有資源類爲傳入請求提供服務,提供者會做什麼?當我創建一個持久資源類(不是每個請求)時,它們與單例資源類有什麼不同?或者這些課程還是提供者?JAX-RS中的Provider是什麼意思?

回答

88

提供程序是擴展和自定義JAX-RS運行時的簡單方法。你可以把它們想象成插件(可能)改變運行時的行爲,以完成一套(程序定義的)目標。

提供商是相同資源類,它們的存在,在概念上,在資源類和JAX-RS實施-之間的電平。如果有幫助,您可以將它們與設備驅動程序(存在於用戶和內核空間之間)相提並論。這是一個廣泛的概括。

當前JAX-RS規範定義了三類提供者。它們之間的共同點是所有提供者都必須通過@Provider註釋來標識,並遵循特定的構造函數聲明規則。除此之外,不同的提供者類型可能會有額外的註釋,並且會實現不同的接口。


實體提供商

這些提供商控制數據表示的映射(如XML,JSON,CSV)爲它們的Java對象的等同物。

上下文提供

這些提供商控制該資源可以經由@Context註解訪問上下文。

異常提供商

這些提供商控制Java異常到JAX-RS響應實例的映射。


你的運行中會與一些預定義的提供者,這將是負責執行的功能的基礎水平(例如用於映射和XML,翻譯的最常見的異常等等)。您也可以根據需要創建自己的提供者。

JAX-RS specification是閱讀這些不同提供程序類型及其功能的好參考(請參閱第4章)。

+0

謝謝。我想我得到了這個事情的想法=) –

+0

很好解釋@Perception。這對我的理解確實有幫助。 –

+0

很好解釋。但有一個問題 - @provider實現如何與通過web.xml中的初始參數(jersey.config.server.provider.classnames)注入的javax.ws.rs.core.Feature接口的實現不同?訂單如何控制? –

6

@Provider註釋用於任何感興趣的JAX-RS運行時,如化MessageBodyReaderMessageBodyWriter。對於HTTP請求,MessageBodyReader用於將HTTP請求實體主體映射到方法參數。在響應方面,通過使用MessageBodyWriter將返回值映射到HTTP響應實體主體。如果應用程序需要提供額外的元數據(例如HTTP標頭或不同的狀態代碼),則方法可以返回一個包裝實體的響應,並且可以使用Response構建該響應。ResponseBuilder

@Provider註釋使您能夠在原始XML級別檢查傳入和傳出郵件,並且以這種方式Provider是客戶端上Dispatch的對應部分。