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