JAX-RS 從傻逼到牛叉 7:注入參數的自動類型轉換
Posted on 2012-01-10 13:17 蜀山兆孨龘 閱讀(3194) 評論(2) 編輯 收藏 所屬分類: Java EE 、SOA前面介紹了各種請求參數的注入,這些參數在 HTTP 請求中都是以純文本的方式存在的。在處理參數的時候,往往需要把這些文本參數轉換為 Java 對象。JAX-RS 提供了一些內置的規則里自動完成這種轉換。
轉換規則一覽
JAX-RS 提供了四條自動類型轉換規則,下面我們逐條考察。
原始類型
這個早就見識過了,無需多說。舉例回顧一下:
@GET @Path("{id}") public Movie getXxx(@PathParam("id") int id) {/*...*/}
提供接受單個 String
參數的構造器的類型
這個也不難理解,JAX-RS 會自動調用該構造器創建一個對象:
public class Style { public Style(String name) {/* ... */} // ... } @GET @Path("{name}") public Movie getXxx(@PathParam("name") Style style) { // JAX-RS 已自動調用 xxx = new Style(name) // ... }
提供靜態工廠方法 valueOf(String)
的類型
也好理解。特別需要注意的是,所有的枚舉類型都在此列,因為編譯器會自動給枚舉類型加上一個這樣的工廠方法。例如:
public enum Style {/*...*/} @GET @Path("{name}") public Movie getXxx(@PathParam("name") Style style) { // JAX-RS 已自動調用 style = Style.valueOf(name) // ... }
類型參數滿足前兩個條件的 List<T>
、Set<T>
和 SortedSet<T>
這條規則適用于多值參數,例如查詢參數:
@GET @Path("xxx") public Movie getXxx(@QueryParam("style") Set<Style> styles) { // JAX-RS 已自動轉換每個 Style 對象并組裝到 Set 中 // ... }
轉換失敗的處理
如果轉換失敗,JAX-RS 會根據情況自動拋出一個包裝了初始異常,但是帶不同 HTTP 錯誤碼的 WebApplicationException
:對矩陣參數(@MatrixParam
)、查詢參數 (@QueryParam
)或路徑參數(@PathParam
)來說為 HTTP 404 找不到
,而對頭部參數(@HeaderParam
)或 Cookie 參數(@CookieParam
)為 HTTP 400 錯誤請求
。