2015-04-07 34 views
0

我在項目中使用apache cxf來實現Jax-rs實現。我有以下地址定義的服務: http://ip:port/myservice/ {操作}Apache CXF - 處理操作中丟失的路徑參數

考慮一個操作的定義如下

@Override 
@GET 
@Path("operation1/{x}/{y}") 
@Produces("application/xml") 
public String operation1(@PathParam("x") final String x, @PathParam("y") final String y) { 
    return null; 
} 

在請求者使得與一些操作名稱的請求的情況下這個服務器未在myservice中定義,它將返回404,這是預期的行爲。但是,在正確請求操作名稱但路徑參數不正確的情況下,我得到了相同的404。如果請求中缺少{x}或{y}路徑參數,我想創建一個適當的錯誤。但我無法找到一種優雅的方式,我可以根據操作處理異常情況。在這種情況下,CXF從不映射到操作。

我有此異常映射:

​​

}

將處理所有的錯誤情況,但它不提供任何資料的請求在異常哪個網址。 有沒有辦法可以在不定義路徑參數的情況下爲不同的操作處理異常? 對於例如:我想處理以下請求與一些自定義邏輯僅爲operation1定義。 http://ip:port/myservice/operation1/20

回答

1

我看到兩種解決方案爲您的情況。
1)移動你的路徑參數來查詢參數。 @QueryParam
2)創建一個過濾器,它映射到URL operation1/*

+0

我怎樣才能把過濾器放在CXF中的特定URL模式? – ishan

+0

你可以查看這篇文章https://www.safaribooksonline.com/library/view/java-ee-7/9781449370589/ch04.html或http://www.developerscrappad.com/1781/java/java -ee/rest-jax-rs/java -ee-7-jax-rs-2-0 -cors-on-rest-how-to-make-rest-apis-accessible-from-a-different-domain/ – VladS

+0

我看着攔截器,發現它們過於複雜。我沒有時間理解CXF中的整個攔截機制(您必須),但我仍然認爲這將是更好的方法來處理錯誤。 – ishan

0

雖然找到了我的情況的解決方案,我需要驗證路徑參數,我發現this link這說明我的問題一個很好的解決方法。儘管它只是一種破解,並不是在現有代碼中實現的好主意,但是如果您需要在各自的操作中使用路徑參數,則可以考慮它。