前面介绍了各种请求参数的注入,这些参数在 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 错误请求。