2011-07-05 49 views
4

RESTEasy(JAX-RS)允許通過子資源進行動態調度。例如:RESTEasy除子資源以外的JAX-RS動態調度

POST /customers/create 
{"name":"Smith","country":"jp"} 

我們可以有一個根資源來處理路徑「/客戶」與沒有HTTP方法但@Path(「/創建」)註釋的方法。此方法返回JAX-RS查看繼續處理請求的資源。但是,此資源必須處理「/ customers/create」路徑。

我有一個現有的情況不同種類的實體可以創建:

POST /customers/create 
{"name":"Smith"} 

POST /locations/create 
{"name":"Chicago"} 

我想補充創建基於請求主體的附加屬性中的任何一種實體的能力:

POST /entities/create 
{"type":"customer","name":"Smith"} 

實質上,我想將請求轉發到處理「POST/customers/create」的代碼。我可以編寫被稱爲「POST/entities/create」的子資源定位器並返回客戶資源,但JAX-RS無法分派請求,因爲客戶資源不處理路徑「/ entities/create」。有沒有辦法在轉發請求時將URL更改爲/ customers/create?

此時,我無法更改API以使「客戶」成爲「實體」的真正子資源。

回答

5

如果您使用RestEasy的3它實現了JAX-RS 2.0,那麼你可以嘗試使用ContainerRequestFilter註釋@Provider @PreMatching

在這個過濾器,你可以調用ContainerRequestContext#setRequestUri(URI)方法來改變基於請求的內容的請求URI,因此,從前進到/entities/create/customers/create/locations/create@PreMatching註釋表示過濾器將在之前被稱爲目標資源方法匹配,因此這是您應該能夠執行重定向的位置。

(你甚至可以更換請求的內容,例如: {"type":"customer","name":"Smith"} - 使用ContainerRequestContext#getInputStream()ContainerRequestContext#setInputStream(InputStream)方法>{"name":"Smith"}

HTH 澤維爾

+0

不要忘記使用資源URI。即'setRequestUri(new Uri(「/ path/to/other」))' – Brice

0

我懷疑是否有標準的JAX-RS方法來在返回子資源之前更改URL。但我有一個可能的解決方案來解決你的問題。

定義像這樣的Generic Rest資源:POST /entities/{entityType}。根據路徑參數entityType可以直接決定什麼subresouce可以實例(例如,使用一個靜態Map<String, Class<?>>持有實體路徑)