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