前面介紹了各種請(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è)早就見(jiàn)識(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)求
。