前面介紹了各種請求參數的注入,這些參數在 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 錯誤請求
。